zoukankan      html  css  js  c++  java
  • js对象数组按属性快速排序

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

    代码
    <script>
    /*
    * 洗牌
    */
    function getRandomPlayCard(m){
    var array1=new Array(m);
    for(var i=0;i<m;i++){
    var rnd=Math.floor(Math.random()*(i+0.99999))
    array1[i]
    =array1[rnd];
    array1[rnd]
    =i;
    }
    return array1;
    };
    /*
    * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序.
    * @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;
    };

    for(var i=0;i<1000;i++){
    document.write(
    '<div>a'+i+'</div>')
    }

    var els=document.getElementsByTagName('div');

    var cards=getRandomPlayCard(els.length);

    var randomEls=[];
    for(var i=0,len=cards.length;i<len;i++) randomEls[cards[i]]=els[i];//按洗出的牌来洗元素数组
    alert(['总数:',randomEls.length,'打乱顺序后: ',randomEls[0].innerHTML,randomEls[randomEls.length-1].innerHTML]);



    var d0=new Date();
    var elsSorted=sortBy(randomEls,function(el){return el.sourceIndex+100000000;})

    alert([
    '总数:',elsSorted.length,'排序耗时:',new Date()-d0,'重新排序后: ',elsSorted[0].innerHTML,elsSorted[elsSorted.length-1].innerHTML]);

    </script>

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

  • 相关阅读:
    jquery 删除cookie失效的解决方法
    SQL Server 抛出自定义异常,由C#程序俘获之并进行相应的处理
    SqlServer中的自增的ID的最后的值:
    Stream/Bytes[]/Image对象相互转化
    TextBox禁止复制粘贴和数字验证,小数验证,汉字验证
    扩展WPF的DataGrid按方向键移动焦点
    WPF 中获取DataGrid 模板列中控件的对像
    IIS设置文件 App_Offline.htm 网站维护
    IIS设置文件 Robots.txt 禁止爬虫
    js中的整除运算
  • 原文地址:https://www.cnblogs.com/jkisjk/p/array_quickly_sortby.html
Copyright © 2011-2022 走看看