Js中數(shù)組的sort函數(shù)對(duì)數(shù)組某一項(xiàng)進(jìn)行排序

與友交流時(shí),被問到一道數(shù)組排序的題:

①:

[
    {key:1, value: '123123'},
    {key:2, value: '123'},
    {key:3, value: '12312'},
    {key:4, value: '123111112'},
    {key:5, value: '12312'},
    {key:6, value: '12311112'}
]

②:

[
    {key: 2, value: "123"},
    {key: 3, value: "12312"},
    {key: 5, value: "12312"},
    {key: 1, value: "123123"},
    {key: 6, value: "12311112"},
    {key: 4, value: "123111112"}
]

要求把①根據(jù)數(shù)組里的’value'字段變成②那樣。
前一天下午跟著大哥作為陪同去面了一個(gè)小哥,中間小哥被問到sort里a-b是升序還是降序。然后看到這道題時(shí)就想到了sort排序,此篇作為小筆記

w3school上對(duì)于sort的定義和用法原話是:

sort() 方法用于對(duì)數(shù)組的元素進(jìn)行排序。排序順序可以是字母或數(shù)字,并按升序或降序。默認(rèn)排序順序?yàn)榘醋帜干颉?注意:當(dāng)數(shù)字是按字母順序排列時(shí)"40"將排在"5"前面。使用數(shù)字排序,你必須通過一個(gè)函數(shù)作為參數(shù)來調(diào)用。函數(shù)指定數(shù)字是按照升序還是降序排列。這種方法會(huì)改變?cè)紨?shù)組!)

語法:

array.sort(sortfunction)
參數(shù)sortfunction可選。必須是函數(shù)。
sortfunction接收兩個(gè)參數(shù),這兩個(gè)參數(shù)決定升序還是降序:a-b則表示升序,b-a則表示降序

sortfunction如果帶參數(shù),參數(shù)是一個(gè)比較函數(shù)。比較2個(gè)值,返回一個(gè)數(shù)字。參數(shù) a 和 b,其返回值如下:

若 a < b,則返回負(fù)數(shù)
若 a == b,則返回 0
若 a > b,則返回正數(shù)
所以當(dāng)函數(shù)返回值為1的時(shí)候就交換兩個(gè)數(shù)組項(xiàng)的順序,否則就不交換。

API復(fù)習(xí)完了,我們來把題做完,根據(jù)哪一項(xiàng)排序,就取出這一項(xiàng)的值做對(duì)比就好:

arr.sort(function (a, b){
    var val1 = a.value;
    var val2 = b.value;
    return val1 - val2;
})

多條件排序也可以在sortfunction函數(shù)了進(jìn)行多次判斷,這是對(duì)number的排序,如果是對(duì)string,sort則會(huì)按照ASCII字符進(jìn)行排序

sort函數(shù)對(duì)數(shù)字排序無效

有時(shí)候會(huì)遇到排序無效的問題:

let arr = [1,10, 15, 3,  5, 25, 3];
arr.sort(); 

你以為會(huì)輸出: [1, 3, 3, 5, 10, 15, 25] ?
實(shí)際會(huì)輸出:[1, 10, 15, 25, 3, 3, 5]

這是為什么呢,在源碼里我們可以看到,sort方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()方法

x = TO_STRING(x);
y = TO_STRING(y);

ASCII字符里,5和3大于10
解決辦法呢,自己手動(dòng)設(shè)置sort返回規(guī)則的函數(shù)作為sortfunction的參數(shù)傳過:

let compare = function (a, b) {
    if (a < b) {
        return -1;
    } else if (a > b) {
        return 1;
    } else {
        return 0;
    }
}

這樣就正常了。

最后給出一篇簡(jiǎn)友寫的sort用的是什么排序算法的文:
http://www.itdecent.cn/p/0ddbc3c8f683

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:在開發(fā)中,數(shù)組的使用場(chǎng)景非常多,平日中也涉及到很多數(shù)組的api/相關(guān)操作,一直也沒有對(duì)這塊內(nèi)容進(jìn)行一塊整理總...
    七色煙火閱讀 3,397評(píng)論 0 3
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • 在實(shí)際的業(yè)務(wù)當(dāng)中,很多時(shí)候要對(duì)定義好的數(shù)組重新排序。在JavaScript中自帶了兩個(gè)方法,可以對(duì)數(shù)組進(jìn)行排序操作...
    沈三公子閱讀 3,704評(píng)論 0 1
  • Javascript有很多數(shù)組的方法,有的人有W3C的API,還可以去MDN上去找,但是我覺得API上說的不全,M...
    頑皮的雪狐七七閱讀 4,493評(píng)論 0 6
  • JS數(shù)組排序方法有兩個(gè):reverse()和sort(),其中reverse()可將數(shù)組進(jìn)行倒序,而sort()則...
    前端王睿閱讀 13,907評(píng)論 0 11

友情鏈接更多精彩內(nèi)容