遇到一個奇葩問題,陣列排序在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)仍是舊的。
- 比較函式如果不傳,則預設按照字元編碼的順序升序排列。
-
如果想按照其他標準進行排序,就需要提供比較函式,該函式要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函式應該具有兩個引數 a 和 b,其返回值如下:
- 若 a 小於 b,在排序後的陣列中 a 應該出現在 b 之前,則返回一個小於 0 的值。
- 若 a 等於 b,則返回 0。
- 若 a 大於 b,則返回一個大於 0 的值。
經過測試
比較函式的返回結果如果不是數字(Boolean或者NaN或者String或者Object),都不會排序。
總結下:
-
升序排列
,返回值可以簡寫為:a-b
-
降序排序
,返回值可以簡寫為:b-a