數組的sort方法原理


數組中有兩種可以排序的方法,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM