1. 程式人生 > >JavaScript學習筆記十三:高階函式-sort

JavaScript學習筆記十三:高階函式-sort

排序演算法

排序的核心是比較兩個元素的大小,通常規定,對於兩個元素xy,如果認為x < y,則返回-1,如果認為x == y,則返回0,如果認為x > y,則返回1

JavaScript的Arraysort()方法就是用於排序的,但是排序結果可能讓你大吃一驚:

// 看上去正常的結果:
['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是同一物件