简介
对于sort,有几个点需要明确一下:
1. 用于对数组元素进行排序;
2. 在原数组上进行操作,不生成副本;
3. 以字符编码(ASCII编码)方式排序。
数组比较
一般数组
var arr = [1,10,30,100,20,5];
arr.sort()
>>> [1, 10,100,20,30,5] //这个是根据编码排序
若要正常比较大小,需要封装一个函数:
function sortArr(a,b){
return a-b;
}
arr.sort(sortArr);
>>> [1,5,10,20,30,100]
一维数组与二维数组
var arr = [1,2,[1,2]];
arr.sort();
>>> [1,[1,2],2] //以第一位为基准比较
var arr1 = [1,2,[2,1]];
arr1.sort();
>>> [1,2,[2,1]] //若调换数组大小,可见结果又不一样了
因此,当一维与二维数组比较时,以二维数组的第一位为准进行比较。
二维数组之间比较
var arr1= [[5,2],[6,7],[10,4]];
若执行代码
arr1.sort();
>>> [[10,4],[5,2],[6,7]] //以各数组第一位为基准进行比较
如果我们要按照正常顺序比较大小,要怎么办呢?那就需要如下代码:
function sortArr1(a,b){
return a[0]-b[0]; // 取值代表以数组第几位为基准
}
接着,我们执行
arr1.sort(sortArr1);
>>> [[5,2],[6,7],[10,4]]
若改变数组索引值,
function sortArr1(a,b){
return a[1]-b[1]; // 取值代表以数组第2位为基准
}
那么,结果就为
arr1.sort(sortArr1);
>>> [[5,2],[10,4],[6,7]]
然而,对于上面的数组比较结果,大家有没有很困惑?数组之间是比较了,那数组内部呢,如何排序呢?这就需要我们再调用一个函数:
function inner(a,b){
return a-b;
}
function outer(x,y){
return x.sort(inner)[0] - y.sort(inner)[0];
}
arr1.sort(outer)
>>> [[2,5],[4,10],[6,7]]
仔细看上面的代码,是不是可以适当的优化呢?结合之前我们说过的callee的用法,于是就有了下面的终极版本!
function arrSort(x,y,i){// i代表以数组第几位为基准进行比较
if( x[i] && y[i] ){
return x.sort(arguments.callee)[i] - y.sort(arguments.callee)[i];
}else{
return x-y;
}
};
总结
以上写法均以正序排列为准,如果要倒序排列,封装函数x-y的部分改为y-x即可。 若有任何错误,请留言指教!(此文原创,转发或者分享烦请注明出处,感谢。)