javascript中sort方法的完整解析--排序
說起對陣列的排序,大家能想到的應該是氣泡排序,快速排序,sort排序,以及希爾排序吧,但是可能對sort排序只停留再陣列層面(每個元素均是數字或者字串),事實上,它還可以對物件進行排序。
原理是:不管元素是什麼型別,sort排序始終是根據元素的unicode編碼進行的
下面來分別看下各種情況:
元素為數字或者字串:
var arr1 = [10,1,5,2,3];
arr1.sort();
console.log(arr1);
大家可以看下它的結果:
很明顯是根據unicode編碼來排序的,這也顯示了其不穩定性。
[語法]:
arr.sort() arr.sort(compareFunction)
[引數]:
compareFunction
可選。用來指定按某種順序進行排列的函式。如果省略,元素按照轉換為的字串的諸個字元的Unicode位點進行排序。[返回值]:
返回排序後的陣列。原陣列已經被排序後的陣列代替。[描述]:
如果沒有指明compareFunction
,那麼元素會按照轉換為的字串的諸個字元的Unicode位點進行排序。例如 "Banana" 會被排列到 "cherry" 之前。數字比大小時,2 出現在 10 之前,但這裡比較時數字會先被轉換為字串,所以"10" 比 "2" 要靠前。
如果指明瞭compareFunction
,那麼陣列會按照呼叫該函式的返回值排序。即a 和 b 是兩個將要被比較的元素:
- 如果
compareFunction(a, b)
小於 0 ,那麼 a 會被排列到 b 之前;
- 如果
compareFunction(a, b)
等於 0 , a 和 b 的相對位置不變。備註: ECMAScript標準並不保證這一行為,而且也不是所有瀏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
- 如果
compareFunction(a, b)
大於 0 , b 會被排列到 a 之前。 compareFunction(a, b)
必須總是對相同的輸入返回相同的比較結果,否則排序的結果將是不確定的。
- var arr1 = [10,1,5,2,3]; function compare(a,b){ if (a < b) { return -1; } if (a > b) { return 1; } // a must be equal to b return 0; } arr1.sort(compare); console.log(arr1);
- var arr1 = [10,1,5,2,3]; arr1.sort(function(a, b) { return a - b; }); console.log(arr1);
元素為物件時(可按其中某個屬性來排序):
var items = [
{ name: 'Edward', age: 21 },
{ name: 'Sharpe', age: 37 },
{ name: 'And', age: 45 },
{ name: 'The', age: -12 },
{ name: 'Magnetic',age:0 },
{ name: 'Zeros', age: 37 }
];
items.sort(function (a, b) {
if (a.age > b.age) {
return 1;
}
if (a.age< b.age) {
return -1;
}
// a 必須等於 b
return 0;
});
則items為:var arr1 = [10,1,5,2,3];arr1.sort();console.log(arr1);