js sort方法指南
本文将详细介绍如何使用sort
方法对数组中的原始数据和对象进行排序:
sort 方法简介
js
提供了一个排序方法sort
可以对数组进行就地排序(意味着不进行复制)并返回排序后的数组。我们可以通过传递对比函数来修改内部的数组元素的顺序,但是不能修改sort
方法所使用的算法。
使用方式:
// 最简单的用法,不需要传递一个对比方法,使用默认的
[].sort();
// 使用箭头函数
[].sort((a, b) => {
...
})
// 传递一个方法
[].sort(compareFn)
在过去的 Chrome 中,排序算法并不像今天那么好。它之前的实现之一包括插入排序O(n²)
。
但是在现在我们使用的是一种名为Tim Sort
O(n log n)
的算法,此算法修改了合并排序,作为自适应稳定的归并排序变体。
稳定的排序算法意味着如果两个相同值的值彼此相邻,则它们在排序后保持相同的顺序。
对原始数据进行排序
对字符串数组进行排序
const names = ["Darui", "Bee", "Naruto", "Ada", "Sasuke", "Baki", "A"];
console.log(names.sort());
// 输出: ["A", "Ada", "Baki", "Bee", "Darui", "Naruto", "Sasuke"]
JavaScript
默认按字典顺序排序。字典顺序意味着像字典一样按字母顺序排序。如果两个字符串相等,则将最短的字符串放在第一位。
const str = ["aab", "ba", "aac", "bab", "aaa", "Aab", "aaaa"];
// 结果
"Aab" // 大写优先
"aa|a"
"aa|aa" // 和aaa相同,但是比aaa多一个a字符
"aa|b" // 第三个字符c比aaaa中的a靠后
"aa|c" // 第三个字符c比aab的b靠后
"ba" // b比a靠后
"bab"
对数字数字进行排序
对于纯数字数组不能直接通过sort()
方法进行排序。
const scores = [9, 80, 19, 4, 20, 53];
console.log(scores.sort());
// 输出: [19, 20, 4, 53, 80, 9]
// 并不符合预期
默认情况下,JavaScript
按字典顺序排序。对于字符串来说非常有用,但对于数字来说却很糟糕。我们必须通过一个对比方法。
function compareNumbers(a, b) {
if (a < b) {
return -1; // a 比 b 优先
} else if (a > b) {
return 1; // b 比 a 优先
}
return 0; // 不修改顺序
}
当两个元素传递给对比函数,如果返回小于 0
,a
则放在前面。如果结果大于0
,b
则放在第一位。如果结果等于0
,则保持a
和b
的顺序相同。
function(a, b) return value | 排序 |
---|---|
> 0 | b排在a前面 |
< 0 | a排在b前面 |
=== 0 | 不改变顺序 |
通过在对比函数中返回一个整数,用于sort
方法最终确定比较元素时的顺序。
为了正确地对数字进行排序,我们在下面的例子使用升序(a
> b
)对数字进行排序的方法。
const scores = [9, 80, 19, 4, 20, 53];
scores.sort((a, b) => {
// 其实就是上面compareNumbers方法中的else if (a > b)判断
return a - b;
});
console.log(scores);
// 输出 [4, 9, 19, 20, 53, 80]
降序就是使用b - a
来实现:
const scores = [9, 80, 19, 4, 20, 53];
scores.sort((a, b) => {
// 其实就是上面compareNumbers方法中的if (a < b)判断
return b - a;
});
console.log(scores);
// 输出 [80, 53, 20, 19, 9, 4]
对对象数组进行排序
在 JavaScript
中,对象是具有key:value
成对属性集合的变量。
const characters = [{
name: 'eren',
age: 1
},
{
name: 'mikasa',
age: 20
},
{
name: 'levi',
age: 90
},
{
name: 'armin',
age: 10
},
];
由于对象具有多个属性,因此我们也需要传递一个对比函数来按我们想要的属性进行排序。
比如想按照年龄来排序文章来源:https://www.toymoban.com/news/detail-604956.html
characters.sort((a, b) => {
return a.age - b.age;
});
name
则按字典顺序排序。文章来源地址https://www.toymoban.com/news/detail-604956.html
characters.sort((a, b) => {
// 确保大小写同步
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);
到了这里,关于js sort方法指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!