JS对象数组 按属性值 快速排序

作者: 神木惊蛰 | 来源:发表于2018-06-15 16:47 被阅读0次

    前一篇《关于selector性能比赛》中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化ie下的排序。
    按所推荐的程序在IE下跑了下,的确,排序耗时很小。

    /*
    * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序.
    * @method soryBy
    * @static
    * @param {array} arr 待处理数组
    * @param {string|function} prop 排序依据属性,获取
    * @param {boolean} desc 降序
    * @return {array} 返回排序后的新数组
    */
    var sortBy =function (arr, prop, desc){
        var props=[],
        ret=[],
        i=0,
        len=arr.length;
        if(typeof prop=='string') {
            for(; i<len; i++){
                var oI = arr[i];
                (props[i] = new String(oI && oI[prop] || ''))._obj = oI;
            }
        }
        else if(typeof prop=='function') {
            for(; i<len; i++){
                var oI = arr[i];
                (props[i] = new String(oI && prop(oI) || ''))._obj = oI;
            }
        }
        else {
            throw '参数类型错误';
        }
        props.sort();
        for(i=0; i<len; i++) {
            ret[i] = props[i]._obj;
        }
        if(desc) ret.reverse();
        return ret;
    };
    

    Array原生的sort,当它传一个比较函数时,由于它内部用哪种排序算法,都需要多次比对,所以,耗时是很自然的事。
    上面的快速排序,它并没有多次比对,
    而是:
    1。取出el属性值,用属性值产生一个String对象,
    2。将el附在String对象上。
    3。用String对象组成数组。
    4。用原生的sort进String对象数组排序。
    5。在排好序的String数组中,按序取出el。
    即得到排好序的el数组。

    相关文章

      网友评论

        本文标题:JS对象数组 按属性值 快速排序

        本文链接:https://www.haomeiwen.com/subject/eoemeftx.html