JavaScript Array sort() (陣列排序)

陣列 (array) 的 sort() 方法用來重新排序陣列中的元素。

語法:

ary.sort()
ary.sort(compareFunction)

sort() 預設會將元素轉型成字串再做比較,比較的方式是從左到右逐一比對元素中的每個字元的 Unicode code point 大小。

sort() 執行後會返回排序後的陣列。

字串型態元素的排序

var fruits = ['cherries', 'apples', 'bananas'];

// 返回 ["apples", "bananas", "cherries"]
fruits.sort();

數字型態元素的排序 (Numeric Sort)

var scores = [1, 10, 21, 2]; 

// 注意 10 會排在 2 前面
// 因為字串 '10' 的第一個字元 '1' 比 '2' 的 Unicode code point 小
//
// 返回 [1, 10, 2, 21]
scores.sort();
var things = ['word', 'Word', '1 Word', '2 Words'];

// 返回 ["1 Word", "2 Words", "Word", "word"]
// 因為數字的 Unicode code point 比英文字小
things.sort();

倒轉陣列排序 (Reversing an Array)

你可以搭配 reverse() 方法來將陣列的順序倒轉:

var fruits = ['cherries', 'apples', 'bananas'];

fruits.sort();
fruits.reverse();

// 輸出 ["cherries", "bananas", "apples"]
console.log(fruits);

自定義排序 (Custom Sort)

sort() 可以傳入函數參數 compareFunction,可以用來自訂排序的邏輯,陣列會根據 compareFunction 函數的回傳值來做排序依據。

compareFunction(a, b) 函數接受兩個參數,分別表示兩個元素值怎麼做比較,然後傳回一個數字,可能是正數、0 或負數:

  • compareFunction(a, b) 回傳值如果小於 0 (負數),表示 a 排序在 b 前面
  • compareFunction(a, b) 回傳值如果等於 0,表示 a 和 b 排序一樣位置不動
  • compareFunction(a, b) 回傳值如果大於 0 (正數),表示 b 排序在 a 前面

ECMAscript 標準沒規範當 0 相等的時候,哪個元素排先哪個元素排後,每個瀏覽器的實做可能會不一樣。

用法:

var numbers = [4, 2, 5, 1, 3];

numbers.sort(function(a, b) {
    return a - b;
});

// 輸出 [1, 2, 3, 4, 5]
console.log(numbers);

排序物件元素 (Sorting Object Array)

var members = [
    {name: 'Mike', age: 30},
    {name: 'Jimmy', age: 25},
    {name: 'Judy', age: 20}
];

members.sort(function(a, b) {
    return a.age > b.age;
});

// 順序依序會是 Judy -> Jimmy -> Mike
console.log(members);

亂數排序 (Random Order)

var numbers = [10, 50, 1, 80, 250, 500, 101, 300];

numbers.sort(function(a, b) {
    return 0.5 - Math.random();
});

// 每次執行排序後的結果都會不一樣
numbers; // [250, 10, 80, 1, 500, 101, 50, 300]