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) {
// boolean false == 0; true == 1
return a.age > b.age;
});
// 順序依序會是 Mike -> Jimmy -> Judy
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]