介绍 : sort()
:对数组的元素进行从小到大来排序(会改变原来的数组)如果在使用 sort() 方法时不带参,默认排序顺序是在将元素转换为字符串按照Unicode 编码,从小到大进行排序
举例 1:(当数组中的元素为字符串时)
let arr1 = ['e', 'b', 'd', 'a', 'f', 'c'];
let result = arr1.sort(); // 将数组 arr1 进行排序
console.log('arr1 =' + JSON.stringify(arr1));
console.log('result =' + JSON.stringify(result));
// 结果
// arr1 =["a","b","c","d","e","f"]
// result =["a","b","c","d","e","f"]
从上方的打印结果中,我们可以看到,sort 方法会改变原数组,而且方法的返回值也是同样的结果
举例 2:(当数组中的元素为数字时)
let arr2 = [5, 2, 11, 3, 4, 1];
let result = arr2.sort(); // 将数组 arr2 进行排序
console.log('arr2 =' + JSON.stringify(arr2));
console.log('result =' + JSON.stringify(result));
// 结果
// arr2 = [1,11,2,3,4,5]
// result = [1,11,2,3,4,5]
上方的打印结果中,你会发现,使用 sort() 排序后,数字11
竟然在数字2
的前面。这是为啥呢?因为上面讲到了,sort()
方法是按照Unicode 编码进行排序的。
那如果我想让 arr2 里的数字,完全按照从小到大排序,怎么操作呢
sort()方法:带参时,自定义排序规则
如果在 sort()方法中带参,我们就可以自定义排序规则。具体做法如下:
我们可以在 sort()添加一个回调函数,来指定排序规则。
回调函数中需要定义两个形参,浏览器将会分别使用数组中的元素作为实参去调用回调函数。
浏览器根据回调函数的返回值来决定元素的排序:(重要)
- 如果
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前;- 如果
compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变- 如果
compareFunction(a, b)
大于 0 , b 会被排列到 a 之前如果只是看上面的文字,可能不太好理解,看看下面的例子
let arr = [5, 2, 11, 3, 4, 1];
arr.sort(function (a, b) {
console.log("a:" + a, "b:" + b);
});
/*
a:2 b:5
a:11 b:2
a:3 b:11
a:4 b:3
a:1 b:4
*/
let arr = [5, 2, 11, 3, 4, 1];
// 自定义排序规则
let result = arr.sort(function (a, b) {
if (a > b) {
// 如果 a 大于 b,则 b 排列 a 之前
return 1;
} else if (a < b) {
// 如果 a 小于 b,,则 a 排列 b 之前
return -1;
} else {
// 如果 a 等于 b,则位置不变
return 0;
}
});
console.log('arr =' + JSON.stringify(arr));
console.log('result =' + JSON.stringify(result));
// arr = [1, 2, 3, 4, 5, 11];
// result = [1, 2, 3, 4, 5, 11];
简化一下
let arr = [5, 2, 11, 3, 4, 1];
// 自定义排序规则
let result = arr.sort(function (a, b) {
return a - b; // 升序排列
// return b - a; // 降序排列
});
console.log('arr =' + JSON.stringify(arr));
console.log('result =' + JSON.stringify(result));
// 打印结果不变,和上面一致
上方代码还可以写成 ES6 的形式,也就是将 function 改为箭头函数,其写法如下
let arr = [5, 2, 11, 3, 4, 1];
// 自定义排序规则
let result = arr.sort((a, b) => {
return a - b; // 升序排列
});
console.log('arr =' + JSON.stringify(arr));
console.log('result =' + JSON.stringify(result));
上方代码,因为函数体内只有一句话,所以可以去掉 return 语句,继续简化为如下写法
let arr = [5, 2, 11, 3, 4, 1];
// 自定义排序规则:升序排列
let result = arr.sort((a, b) => a - b);
console.log('arr =' + JSON.stringify(arr));
console.log('result =' + JSON.stringify(result));