簡(jiǎn)介
不論在哪一種編程的語(yǔ)言中琅翻,排序都是必備的,所以JS也有自己的排序規(guī)則
語(yǔ)法
arr.sort([compareFunction])
參數(shù)
compareFunction 可選
用來(lái)指定按某種順序進(jìn)行排列的函數(shù)蛇券。如果省略缔恳,元素按照轉(zhuǎn)換為的字符串的各個(gè)字符的Unicode位點(diǎn)進(jìn)行排序。
返回值
排序后的數(shù)組病袄。請(qǐng)注意搂赋,數(shù)組已原地排序,并且不進(jìn)行復(fù)制益缠。
描述
如果沒(méi)有指明 compareFunction 脑奠,那么元素會(huì)按照轉(zhuǎn)換為的字符串的諸個(gè)字符的Unicode位點(diǎn)進(jìn)行排序。例如 "Banana" 會(huì)被排列到 "cherry" 之前幅慌。當(dāng)數(shù)字按由小到大排序時(shí)宋欺,9 出現(xiàn)在 80 之前,但因?yàn)椋](méi)有指明 compareFunction)胰伍,比較的數(shù)字會(huì)先被轉(zhuǎn)換為字符串齿诞,所以在Unicode順序上 "80" 要比 "9" 要靠前。
如果指明了 compareFunction 骂租,那么數(shù)組會(huì)按照調(diào)用該函數(shù)的返回值排序祷杈。即 a 和 b 是兩個(gè)將要被比較的元素:
- 如果
compareFunction(a, b)
小于 0 ,那么 a 會(huì)被排列到 b 之前渗饮; - 如果 compareFunction(a, b) 等于 0 但汞, a 和 b 的相對(duì)位置不變宿刮。備注: ECMAScript 標(biāo)準(zhǔn)并不保證這一行為,而且也不是所有瀏覽器都會(huì)遵守(例如 Mozilla 在 2003 年之前的版本)特占;
- 如果 compareFunction(a, b) 大于 0 糙置, b 會(huì)被排列到 a 之前。
- compareFunction(a, b) 必須總是對(duì)相同的輸入返回相同的比較結(jié)果是目,否則排序的結(jié)果將是不確定的谤饭。
所以,比較函數(shù)格式如下:
function compare(a, b) {
if (a < b ) { // 按某種排序標(biāo)準(zhǔn)進(jìn)行比較, a 小于 b
return -1;
}
if (a > b ) {
return 1;
}
// a must be equal to b
return 0;
}
要比較數(shù)字而非字符串懊纳,比較函數(shù)可以簡(jiǎn)單的以 a 減 b揉抵,如下的函數(shù)將會(huì)將數(shù)組升序排列
function compareNumbers(a, b) {
return a - b;
}
sort
方法可以使用 函數(shù)表達(dá)式 方便地書(shū)寫(xiě):
ar numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
也可以寫(xiě)成:
var numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b);
console.log(numbers);
// [1, 2, 3, 4, 5]
對(duì)象可以按照某個(gè)屬性排序:
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic' },
{ name: 'Zeros', value: 37 }
];
// sort by value
items.sort(function (a, b) {
return (a.value - b.value)
});
// sort by name
items.sort(function(a, b) {
var nameA = a.name.toUpperCase(); // ignore upper and lowercase
var nameB = b.name.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});