Array.sort排序問題

紀輕昀發表於2019-02-16

遇到一個奇葩問題,陣列排序在chrome瀏覽器下沒有問題,而在IE下不生效。查了下資料,原來是寫法有誤。

原來寫法:

var arr = [300, 20, 10, 1, 2];
arr.sort(function(a, b){
    return a > b;
});

期望返回值是[300, 20, 10, 2, 1](chrome下),結果是[300, 20, 10, 1, 2](IE下)

比較函式的返回值應該是數字(正數降序,負數升序,0不動),而我寫成了bool,導致排序失敗。chrome下可能做過相容處理。

最蛋疼的是,在我寫這篇文章時,新版本chrome恢復了,與IE效果成了一樣的,而本地nodejs執行的版本(v10.0.0)仍是舊的。

  1. 比較函式如果不傳,則預設按照字元編碼的順序升序排列。
  2. 如果想按照其他標準進行排序,就需要提供比較函式,該函式要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函式應該具有兩個引數 a 和 b,其返回值如下:

    • 若 a 小於 b,在排序後的陣列中 a 應該出現在 b 之前,則返回一個小於 0 的值。
    • 若 a 等於 b,則返回 0。
    • 若 a 大於 b,則返回一個大於 0 的值。

經過測試

比較函式的返回結果如果不是數字(Boolean或者NaN或者String或者Object),都不會排序。

總結下:

  • 升序排列,返回值可以簡寫為:a-b
  • 降序排序,返回值可以簡寫為:b-a

相關文章