與友交流時(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