MDN中sort定義
MDN中是這樣介紹sort()
函數的:sort() 方法對數組的元素做原地的排序,並返回這個數組。 sort 可能不是穩定的。默認按照字符串的Unicode碼位點(code point)排序。
arr.sort([compareFunction])
語法說明
compareFunction
可選。用來指定按某種順序進行排列的函數。如果省略,元素按照轉換爲的字符串的諸個字符的Unicode位點進行排序。
簡單示例:
var tt = [23,12,34,1,560];
console.log(tt.sort()); //此時sort()內沒有參數
//輸出爲 [1, 12, 23, 34, 560]
簡單的說,sort()
在沒有參數時,返回的結果是按升序來排列的。即字符串的Unicode碼位點(code point)排序。
如果指明瞭 compareFunction(a,b)
,那麼數組會按照調用該函數的返回值排序。記 a
和 b
是兩個將要被比較的元素:
如果 compareFunction(a, b) (返回的值)小於 0 ,那麼 a 會被排列到 b 之前,即參數a,b的順序保存原樣;
如果 compareFunction(a, b) (返回的值) 等於 0 , a 和 b 的相對位置不變。備註: ECMAScript 標準並不保證這一行爲,而且也不是所有瀏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
如果 compareFunction(a, b) (返回的值)大於 0 , b 會被排列到 a 之前。即交換參數a,b的順序
- compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結果,否則排序的結果將是不確定的。
一個栗子
Codewars上有這樣一道kata,是這樣的:給定一個包含對象的數組list和一個比較關鍵字sortBy(數組中對象的值總爲數值,比較關鍵字總是存在,且是對象的某一個鍵),返回一個降序排序後的數組。
解決方案是這樣的:
function sortList (sortBy, list) {
return list.sort(function(a,b){
return b[sortBy]-a[sortBy]
});
}
Note
寫給與我一樣的初學者:
問題是上面的函數爲什麼不這樣寫:return b.a-a.b
我們這樣嘗試一下:
function sortList (sortBy, list) {
return list.sort(function(a,b){
console.log(sortBy);//輸出爲b
console.log(a.sortBy);//輸出爲undefined
console.log(a[sortBy]);//輸出爲3,2,40
return b[sortBy]-a[sortBy]
});
}
sortList('b',[
{a: 1, b: 3},
{a: 3, b: 2},
{a: 2, b: 40},
{a: 4, b: 12}
]);
實際上,變量sortBy
的值爲b
,但在代碼a.sortBy
中,sortBy
的值並沒有引用,sortBy
被認爲是a
對象的一個屬性,但a對象實際並沒有sortBy
這個屬性,所以該代碼會輸出爲undefined
,因此我們要訪問這類屬性,應該寫成a[sortBy
]的代碼。
在這裏,sortBy是一個變量名,如果變量名爲某對象的屬性,則只能通過[]
運算符進行對象屬性的訪問。
(待續)