數組中有兩種可以排序的方法,reverse()和sort(),reverse()方法會反轉數組項的順序
let arr1 = [1,2,3,4,5] arr1.reverse() console.log(arr1) //[ 5, 4, 3, 2, 1 ] let arr2 = [1,2,6,4,5] arr2.reverse() console.log(arr2) //[ 5, 4, 6, 2, 1 ]
可以看到reverse()方法只會對數組進行反轉,並沒有真正的排序,因此有了 sort() 方法
sort()方法的原理是調用數組項的toString()方法,得到數組項的字符串,然后再比較字符串的Unicode碼的順序進行排序,即使數組中的每一項都是數值,比較的也是字符串的順序。看下面的例子:
let arr3 = [0, 1, 5, 10, 15] arr3.sort() console.log(arr3) //[ 0, 1, 10, 15, 5 ]
如上所見,雖然5小於10,但是在排序的時候還是排在了最后,這是因為排序的時候比較的是字符串,很顯然這種排序方式不是我們想要的,因此sort方法可以接收一個比較函數作為參數,這樣我們就可以自己指定哪個值位於前面哪個值排在后面。
一、升序排列
若 val1小於 val2,即 val1 - val2 小於零,則返回一個小於零的值,數組將按照升序排列。
//定義一個比較函數 function compare (val1, val2) { return val1 - val2 } let arr4 = [0, 1, 5, 10, 15] arr4.sort(compare) console.log(arr4) //[ 0, 1, 5, 10, 15 ]
二、降序排列
若 val1大於 val2,即 val1 - val2 大於零,則返回一個大於零的值,數組將按照降序排列。
//定義一個比較函數 function compare (val1, val2) { return val2 - val1 } let arr4 = [0, 1, 5, 10, 15] arr4.sort(compare) console.log(arr4) //[ 15, 10, 5, 1, 0 ]
三、按照數組對象中的某個屬性值進行排序
有時候我們需要根據對象中的某個屬性值對數組項進行排序,如下面我們根據年齡對數組項進行排序:
function compare (propertyName) { return function (obj1, obj2){ let value1 = obj1[propertyName] let value2 = obj2[propertyName] return value1 - value2 } } let arr5 = [ {name:'leah',age:30}, {name:'jack',age:18}, {name:'jerry',age:20} ] arr5.sort(compare('age')) console.log(arr5)
感覺sort()排序方法更像是快速排序,具體參考這篇文章。
https://zhuanlan.zhihu.com/p/27166852