在js中我们可以对数组元素使用sort方法进行排序,该方法不进行拷贝而是直接影响原数组,使用如下:
var arr =[0,1,56,23,34,3]
arr.sort()
console.log(arr)
//打印[0, 1, 23, 3, 34, 56]
发现结果竟然与预想不一样, 因为在使用sort排序的时候它总会使用第一个字符的ASCII值来进行比较排序。
1. 语法:
arr.sort([compareFunction])
参数解析:compareFunction(可选)用来指定按某种顺序进行排列的函数,该函数有两个参数:
firstEl 第一个比较的元素
secondEl 第二个比较的元素
2. 升序
//箭头函数简写
sort((a,b)=>a - b)
等价于
sort(function(a,b){
if(a < b) {
return -1;
}
if(a > b) {
return 1;
}
if(a == b) {
return 0;
}
})
3. 降序
sort(function(a,b){
return b - a;
})
等价于
sort(function(a,b){
if(a < b) {
return 1;
}
if(a > b) {
return -1;
}
if(a == b) {
return 0;
}
})
4. 原理
其实他们原理一样的 回调函数形参a,b分别代表前后项。数值转为boolean类型时,true代表交换位置,否则不交换。
简写形式:
- a-b 如果>0 转换为true 返回就会进行交换
- a-b 如果<=0 转换为false 返回其位置保持不变
复杂形式:
- 如果return返回-1,其位置保持不变
- 如果return返回0,其位置保持不变
- 如果return返回1,就会进行交换
5. 对象数组排序
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic' },//如果对象属性缺失会引发排序错误
{ name: 'Zeros', value: 37 }
];
//数值比较
items.sort(function (a, b) {
return (a.value - b.value);
})
6. 字符串排序
// 字符串比较
items.sort(function (a, b) {
//调用该方法的字符串转为大写形式并返回
var nameA = a.name.toUpperCase();
var nameB = b.name.toUpperCase();
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
return 0;
});