首页 > 代码库 > js对象数组按属性快速排序
js对象数组按属性快速排序
前一篇《关于selector性能比赛》中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化ie下的排序。
按所推荐的程序在IE下跑了下,的确,排序耗时很小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. * @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数组。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。