@xudongh
2017-03-05T16:54:44.000000Z
字数 1665
阅读 1549
前端开发
在JS中有两种可以直接用来重排序的方法:reverse()和sort()。
reverse()方法会翻转数组项的顺序,并返回原数组。
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr); //[5,4,3,2,1]
sort()方法更加灵活,可按照一定的规则进行排序,其语法为:
arr.sort(compareFunction);
compareFunction是用于指定按某种顺序进行排列的函数,在不指定该函数时,即默认情况下, sort()方法按照升序排列数组项——即最小的值位于最前面,最大的值排在最后面。
由于sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,因此数组元素实际上的排序方法是按照数组中每个字符的Unicode码进行排序。
var arr = [5,10,0,15,1];
arr.sort();
console.log(arr); //[0,1,10,15,5]
在指定compareFunction的情况下,该函数接受两个参数,数组会按照调用该函数的返回值进行排序。即a和b是两个将要被比较的元素:
compareFunction(a,b)<0
,则a被排列在b之前;compareFunction(a,b)=0
,a和b的相对位置不变;compareFunction(a,b)>0
,则a被排列在b之后。因此,假如要对一个数组进行升序排序,可以这样做:
var arr = [5,10,0,15,1];
//比较常用的比较函数
function compare(a,b){
return a-b;
}
arr.sort(compare);
console.log(arr); //[0,1,5,10,15]
以上针对的是一维数组的排序,对于二维数组,同样可以采用sort()方法。
在compareFunction()函数中,要注意比较参数的传参问题。
例如有一组同学的名字以及对应身高的数据,现要对身高进行降序排列。
var arr=[
["小明",172],
["小刚",182],
["小红",168],
["小强",176],
["小云",172]
];
//二维数组的比较函数
function compare(a,b){
return b[1]-a[1]
}
arr.sort(compare);
console.log(arr); //[["小刚", 182], ["小强", 176], ["小明", 172], ["小云", 172], ["小红", 168]]
若不使用sort()方法,使用算法排序对一位数组进行排序(当然我们在js中没必要这样做),如用冒泡排序:
function compare(arr){
var i = arr.length,
j;
while(i > 0){
for(var j = 0; j<i-1; j++){
if(arr[j]>arr[j+1]){
var tem = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tem;
}
}
i--;
}
return arr;
}
var arr = [5,10,0,15,1];
console.log(compare(arr)); //[0, 1, 5, 10, 15]
同样,对二维数组用算法排序,和一维数组的排序并无异同:
function compare(arr){
var i = arr.length,
j;
while(i > 0){
for(var j = 0; j<i-1; j++){
if(arr[j][1]>arr[j+1][1]){
var tem = arr[j+1][1];
arr[j+1][1] = arr[j][1];
arr[j][1] = tem;
}
}
i--;
}
return arr;
}
var arr=[
["小明",172],
["小刚",182],
["小红",168],
["小强",176],
["小云",172]
];
console.log(compare(arr)); //[["小明", 168], ["小刚", 172], ["小红", 172], ["小强", 176], ["小云", 182]]