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 = [ |
小測驗
也可以用上述的例子,來做出「照電話號碼排序」的方法喔~