Javascript中的sort()語法淺談

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) ,那麼數組會按照調用該函數的返回值排序。記 ab 是兩個將要被比較的元素:

  • 如果 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是一個變量名,如果變量名爲某對象的屬性,則只能通過[]運算符進行對象屬性的訪問。


(待續)

發佈了48 篇原創文章 · 獲贊 21 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章