JavaScript 中的 sort 方法,是一個強大且常用的陣列排序工具。
但對於數字排序,很多人可能會覺得它的運作機制有點神秘。
特別是當我們使用 (a, b) => a - b 的方式來排序時,不需要額外進行大小判定或明確返回 1、0、-1,就能輕鬆進行數字排序。
本文將介紹 sort 方法的基本概念,以及為何在數字排序中,直接使用簡單的減法運算,便可達到排序效果。
什麼是 sort 方法?
sort 方法是 JavaScript 陣列的一個內建函數,允許我們對陣列中的元素進行排序。
該方法會直接修改原始陣列,並返回排序後的陣列。基本語法如下:
array.sort([compareFunction])compareFunction是一個可選參數,它決定了排序的順序。- 若不提供該參數,
sort會依據字典序(alphabetical order)將「數字」轉成「字串」再進行排序,這在數字排序時通常會導致意想不到的結果。
基本使用示例
以下是一些常規的 sort 方法用法:
let fruits = ['banana', 'apple', 'grape'];
fruits.sort();
console.log(fruits); // ["apple", "banana", "grape"]
let numbers = [10, 5, 20, 8];
numbers.sort();
console.log(numbers); // [10, 20, 5, 8]當沒有提供 compareFunction 時,sort 方法會將數字當作字串來排序,因此 10 會被放在 2 前面,這不是我們期待的數字排序結果。
為了讓數字排序符合預期,我們需要提供一個 compareFunction。
常規的 compareFunction 寫法
在一般的 compareFunction 中,我們可以手動判斷兩個元素的大小,並返回對應的值來控制排序順序,例如:
function compareFn(a, b) {
if (a > b) {
return 1; // 意即 a 放在 b 後面
}
if (a < b) {
return -1; // 意即 a 放在 b 前面
}
// a 等同於 b
return 0; // 意即 a 與 b 之間的位置不變
}在這裡,當 a 大於 b 時,compareFn 會返回正數 1,告知 sort 將 a 放在 b 的後面。
當 a 小於 b 時,compareFn 會返回負數 -1,表示 a 應該位於 b 前面。
若 a 等於 b,則返回 0,兩者的相對位置保持不變。
使用 (a, b) => a - b 進行數字排序
在數字排序中,我們可以進一步簡化 compareFunction,僅需 (a, b) => a - b 這樣的簡單表達式。
這樣一來,我們不需要進行多餘的大小判斷便能直接獲得正確的排序結果。例如:
let numbers = [10, 5, 20, 8];
numbers.sort((a, b) => a - b);
console.log(numbers); // [5, 8, 10, 20]為什麼 (a, b) => a - b 可以進行數字排序?
在 JavaScript 中,sort 方法依賴 compareFunction 的返回值來決定元素的位置。
根據 MDN 文檔的說明,compareFunction 的返回值有以下意義:
- 若返回值小於
0,表示a應位於b之前。 - 若返回值大於
0,表示a應位於b之後。 - 若返回值為
0,則a和b的相對位置不變。
因此,當我們使用 (a, b) => a - b 時:
- 若
a小於b,a - b的結果會是負值(例如5 - 8 = -3),此時sort會將a放在b前面。 - 若
a大於b,a - b的結果會是正值(例如10 - 5 = 5),此時sort會將a放在b後面。 - 若
a等於b,a - b的結果會是0,sort將保持兩者的相對位置不變。
由於我們只需讓 compareFunction 返回正值、負值或零,直接使用 a - b 可以輕鬆達到排序的目的,不需要額外的邏輯判斷。
結論
在 JavaScript 中,sort 方法可以通過 (a, b) => a - b 的方式簡化數字排序。
這種用法利用了 sort 方法對於 compareFunction 返回值的判斷邏輯,讓我們不必顯式地回傳 1、0、-1,直接達成數字排序的效果。
這不僅提升了代碼的簡潔度,也符合數值排序的直觀需求。
下次遇到數字排序需求時,不妨使用 (a, b) => a - b,體驗這種便捷的寫法!