JavaScript 陣列排序 sort
預設排序
array.sort()是以字串的 Unicode 編碼位置來排序陣列中的元素。
1 | let fruit = ['Orange', 'Banana', 'Apple', 'Cherry'] |
自訂義排序
若用sort()來排序「數字」,我們也會得到「照字母排序」的結果。
下面的執行結果為100排在25之前,因為以字母順序來看,1是排在2之前。
1 | let numbers = [ 25, 3, 100, 67, 45, 7] |
要如何使用自訂義排序?
在sort()帶入比較方法,而比較方法需要自己定義。
原則上:
比較方法應傳入兩個參數,用來做比較。比較方法應回傳正、負值,或是 0,用來決定排序。
以下面的程式碼為例:
- 如果
compare(a, b)回傳 正的值(大於 0)**,就把 a 排在 b **後面。 - 如果
compare(a, b)回傳 負的值(小於 0)**,就把 a 排在 b **前面。 - 如果
compare(a, b)回傳 0,就不動順序。
1 | let numbers = [ 25, 3, 100, 67, 45, 7] |
簡單應用自訂排序
數字由小到大排序
- 當回傳
a - b是4 - 3 = 1,等於回傳大於 0的數字,代表 4 要排在 3 後面。 - 當回傳
a - b是2 - 4 = -2,等於回傳小於 0的數字,代表 2 要排在 4 前面。 - 當回傳
a - b是100 - 100 = 0,等於回傳 0,代表 100 跟 100 不動。
1 | let numbers = [ 2, 4, 3, 100, 1, 100] |
依照物件的值排序
compareName(a, b)與compareAge(a, b)傳入的 a 跟 b,代表person陣列中的物件compareName(a, b)比較姓名的方法a.name跟b.name,代表從物件中取出 name 的值- 若比較的方法是拿字串進行比較,會根據第一個不同字元的 ASCII 編碼進行大小比較。例如:
Banana與Berry比較,第一個位元都是B,就會從第二個位元a跟e開始比較。
compareAge(a, b)比較年齡的方法a.age跟b.age,代表從物件中取出 age 的值
1 | let person = [ |
小測驗
也可以用上述的例子,來做出「照電話號碼排序」的方法喔~