重排序需求:
当我们拿到一组数据之后,很大可能是用Array类型存放的。那么我们在使用的过程中,很可能需要对数据内的元素进行重新排序,让页面显示出我们需要的顺序,或者让数据按照我们需要的顺序排列。
重排序方法:
1. reverse()
2. sort()
reverse()
说明:该函数反转数组的顺序
var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values); //[5,4,3,2,1]
sort()
说明:该函数默认升序排列数组项 -- 即最小值在前,最大值在后。
排序转换逻辑过程:为了实现排序, sort() 方法会调用每个数组项的 toString() 转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort() 方法比较的也是字符串。
var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //[0,1,10,15,5]
可以看到 10 位于 5 之前,这是因为它排序的时候是按字符串排序,那么元素将按照 ASCII 字符顺序进行排序,字符串比较的
时候是按照顺序逐个比较大小。(当然这不是我们想要的)
sort() 可以带参数,参数为函数,这个参数是比较函数
比较函数接收两个参数, 如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0 ,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
那么这样就可以看到预期的结果
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //[0,1,5,10,15]
利用 sort 进行数组对象排序(如果数组项是对象,我们需要根据数组项的某个属性对数组进行排序)
原理相同
var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
var val1 = obj1.name;
var val2 = obj2.name;
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
console.log(arr.sort(compare));
输出结果为
[Object { name="wlz", age=25}, Object {name="zlw", age=24}]
可以看到数组已经按照 name 属性进行了排序。
如果我希望按照 age 排序
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
}
如果想按照 age 进行排序, arr.sort(compare("age")) 即可。
这里还有一个问题,如果数组是 var arr = [{name: "zlw", age:"24"}, {name: "wlz", age: "5"}]; 那么将会是字符串比较,即会出错。
var compare = function (prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
}
扩展内容
sort() 底层实现网址
https://github.com/v8/v8/blob/ad82a40509c5b5b4680d4299c8f08d6c6d31af3c/src/js/array.js
第 710 行
说明:不同的引擎代码底层实现原理不同。
以 V8 引擎为例
V8 引擎 sort 函数只给出了两种排序 InsertionSort 和QuickSort ,数量小于 10 的数组使用 InsertionSort ,比10 大的数组则使用 QuickSort 。