js sort方法指南
本文將詳細(xì)介紹如何使用sort
方法對(duì)數(shù)組中的原始數(shù)據(jù)和對(duì)象進(jìn)行排序:
sort 方法簡(jiǎn)介
js
提供了一個(gè)排序方法sort
可以對(duì)數(shù)組進(jìn)行就地排序(意味著不進(jìn)行復(fù)制)并返回排序后的數(shù)組。我們可以通過(guò)傳遞對(duì)比函數(shù)來(lái)修改內(nèi)部的數(shù)組元素的順序,但是不能修改sort
方法所使用的算法。
使用方式:
// 最簡(jiǎn)單的用法,不需要傳遞一個(gè)對(duì)比方法,使用默認(rèn)的
[].sort();
// 使用箭頭函數(shù)
[].sort((a, b) => {
...
})
// 傳遞一個(gè)方法
[].sort(compareFn)
在過(guò)去的 Chrome 中,排序算法并不像今天那么好。它之前的實(shí)現(xiàn)之一包括插入排序O(n2)
。
但是在現(xiàn)在我們使用的是一種名為Tim Sort
O(n log n)
的算法,此算法修改了合并排序,作為自適應(yīng)穩(wěn)定的歸并排序變體。
穩(wěn)定的排序算法意味著如果兩個(gè)相同值的值彼此相鄰,則它們?cè)谂判蚝蟊3窒嗤捻樞颉?/p>
對(duì)原始數(shù)據(jù)進(jìn)行排序
對(duì)字符串?dāng)?shù)組進(jìn)行排序
const names = ["Darui", "Bee", "Naruto", "Ada", "Sasuke", "Baki", "A"];
console.log(names.sort());
// 輸出: ["A", "Ada", "Baki", "Bee", "Darui", "Naruto", "Sasuke"]
JavaScript
默認(rèn)按字典順序排序。字典順序意味著像字典一樣按字母順序排序。如果兩個(gè)字符串相等,則將最短的字符串放在第一位。
const str = ["aab", "ba", "aac", "bab", "aaa", "Aab", "aaaa"];
// 結(jié)果
"Aab" // 大寫(xiě)優(yōu)先
"aa|a"
"aa|aa" // 和aaa相同,但是比aaa多一個(gè)a字符
"aa|b" // 第三個(gè)字符c比aaaa中的a靠后
"aa|c" // 第三個(gè)字符c比aab的b靠后
"ba" // b比a靠后
"bab"
對(duì)數(shù)字?jǐn)?shù)字進(jìn)行排序
對(duì)于純數(shù)字?jǐn)?shù)組不能直接通過(guò)sort()
方法進(jìn)行排序。
const scores = [9, 80, 19, 4, 20, 53];
console.log(scores.sort());
// 輸出: [19, 20, 4, 53, 80, 9]
// 并不符合預(yù)期
默認(rèn)情況下,JavaScript
按字典順序排序。對(duì)于字符串來(lái)說(shuō)非常有用,但對(duì)于數(shù)字來(lái)說(shuō)卻很糟糕。我們必須通過(guò)一個(gè)對(duì)比方法。
function compareNumbers(a, b) {
if (a < b) {
return -1; // a 比 b 優(yōu)先
} else if (a > b) {
return 1; // b 比 a 優(yōu)先
}
return 0; // 不修改順序
}
當(dāng)兩個(gè)元素傳遞給對(duì)比函數(shù),如果返回小于 0
,a
則放在前面。如果結(jié)果大于0
,b
則放在第一位。如果結(jié)果等于0
,則保持a
和b
的順序相同。
function(a, b) return value | 排序 |
---|---|
> 0 | b排在a前面 |
< 0 | a排在b前面 |
=== 0 | 不改變順序 |
通過(guò)在對(duì)比函數(shù)中返回一個(gè)整數(shù),用于sort
方法最終確定比較元素時(shí)的順序。
為了正確地對(duì)數(shù)字進(jìn)行排序,我們?cè)谙旅娴睦邮褂蒙?a
> b
)對(duì)數(shù)字進(jìn)行排序的方法。
const scores = [9, 80, 19, 4, 20, 53];
scores.sort((a, b) => {
// 其實(shí)就是上面compareNumbers方法中的else if (a > b)判斷
return a - b;
});
console.log(scores);
// 輸出 [4, 9, 19, 20, 53, 80]
降序就是使用b - a
來(lái)實(shí)現(xiàn):
const scores = [9, 80, 19, 4, 20, 53];
scores.sort((a, b) => {
// 其實(shí)就是上面compareNumbers方法中的if (a < b)判斷
return b - a;
});
console.log(scores);
// 輸出 [80, 53, 20, 19, 9, 4]
對(duì)對(duì)象數(shù)組進(jìn)行排序
在 JavaScript
中,對(duì)象是具有key:value
成對(duì)屬性集合的變量。
const characters = [{
name: 'eren',
age: 1
},
{
name: 'mikasa',
age: 20
},
{
name: 'levi',
age: 90
},
{
name: 'armin',
age: 10
},
];
由于對(duì)象具有多個(gè)屬性,因此我們也需要傳遞一個(gè)對(duì)比函數(shù)來(lái)按我們想要的屬性進(jìn)行排序。
比如想按照年齡來(lái)排序文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-604956.html
characters.sort((a, b) => {
return a.age - b.age;
});
name
則按字典順序排序。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-604956.html
characters.sort((a, b) => {
// 確保大小寫(xiě)同步
const nameA = a.name.toUpperCase();
const nameB = b.name.toUpperCase();
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
return 0;
});
console.log(characters);
到了這里,關(guān)于js sort方法指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!