数组之排序——SORT

相信大家对数组排序的sort方法一定不陌生,但笔者最近无意中发现自己对sort的理解并不是那么透彻,特来总结一下。


简介

对于sort,有几个点需要明确一下:
1. 用于对数组元素进行排序;
2. 在原数组上进行操作,不生成副本;
3. 以字符编码(ASCII编码)方式排序。
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即可。 若有任何错误,请留言指教!(此文原创,转发或者分享烦请注明出处,感谢。)