4.6 陣列排序(Sort)
在 javascript/practice
資料夾下,建立 array_sort.html
檔案,以便練習。
Array.sort() 排序字串
預設上,sort() 排序的是字串。然後會影響原來的字串。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
console.log(fruits); // ["Apple", "Banana", "Mango", "Orange"]
Array.sort() 排序數值
如果陣列裡是數值,會發現排序出來的結果跟我們想的不一樣:
var points = [40, 100, 1, 5, 25, 10];
points.sort(); // 字串方式去排序
console.log(points); // [1, 10, 100, 25, 40, 5]
關於 Compare Function(比較函式)
Compare Function 的用途是用來取代 sort() 函式預設的字串排序方式,也就是我們可以自訂排序方式,每次比較兩個數值,然後必需回傳負數、0、正數。
常見寫法:
function(a, b){
return a - b;
}
回傳如果是負數: 就先排 a 再排 b。
回傳如果是正數:就先排 b 再排 a。
回傳如果是 0:就不做任何更動。
例 1:排序由小到大
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){
return a - b;
});
console.log(points); // [1, 5, 10, 25, 40, 100]
解讀:
40、100 會被代入,a 是 40,b 是 100,兩者相減是負數,所以先排 40 再排 100。依此類推。
例 2:排序由大到小
只要將回傳的結果加上負號即可:
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){
return -(a - b);
});
console.log(points); // [100, 40, 25, 10, 5, 1]
解讀:
40、100 會被代入,a 是 40,b 是 100,兩者相減是負數,但因為加上了負號,所以回傳結果是正數,所以先排 100 再排 40。
Array.reverse()
陣列整個反轉:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // 排序
fruits.reverse(); // 反轉
console.log(fruits); // ["Orange", "Mango", "Banana", "Apple"]
練習:排序物件陣列(Sorting Object Arrays)
請將以下的物件陣列,依照 year 來排序,由小到大:
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
// 排序部份寫在這
console.log(cars);
參考作法:
Last updated