JavaScript學習筆記十三:高階函式-sort
阿新 • • 發佈:2019-02-07
排序演算法
排序的核心是比較兩個元素的大小,通常規定,對於兩個元素x
和y
,如果認為x < y
,則返回-1
,如果認為x == y
,則返回0
,如果認為x > y
,則返回1
。
JavaScript的Array
的sort()
方法就是用於排序的,但是排序結果可能讓你大吃一驚:
// 看上去正常的結果:
['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];
// apple排在了最後:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", ' apple'],apple排在了最後,是因為字串根據ASCII碼進行排序,而小寫字母a的ASCII碼在大寫字母之後
// 無法理解的結果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20],Array的sort()方法預設把所有元素先轉換為String再排序,結果'10'排在了'2'的前面,因為字元'1'比字元'2'的ASCII碼小
如果不知道sort()
方法的預設排序規則,直接對數字排序,絕對栽進坑裡!正確的做法是:
var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
}); // [1, 2, 10, 20]
忽略大小寫的比較演算法:
var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if (x1 < x2) {
return -1;
}
if (x1 > x2) {
return 1;
}
return 0;
}); // ['apple', 'Google', 'Microsoft']
注意,sort()
方法會直接對Array
進行修改,它返回的結果仍是當前Array
:
var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一物件