Heim >Web-Frontend >js-Tutorial >js对象数组按属性快速排序_javascript技巧

js对象数组按属性快速排序_javascript技巧

WBOY
WBOYOriginal
2016-05-16 18:11:101185Durchsuche

按所推荐的程序在IE下跑了下,的确,排序耗时很小。

复制代码 代码如下:

<script> <BR>/* <BR>* 洗牌 <BR>*/ <BR>function getRandomPlayCard(m){ <BR>var array1=new Array(m); <BR>for(var i=0;i<m;i++){ <BR>var rnd=Math.floor(Math.random()*(i+0.99999)) <BR>array1[i]=array1[rnd]; <BR>array1[rnd]=i; <BR>} <BR>return array1; <BR>}; <BR>/* <BR>* 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. <BR>* @method soryBy <BR>* @static <BR>* @param {array} arr 待处理数组 <BR>* @param {string|function} prop 排序依据属性,获取 <BR>* @param {boolean} desc 降序 <BR>* @return {array} 返回排序后的新数组 <BR>*/ <BR>var sortBy =function (arr, prop, desc){ <BR>var props=[], <BR>ret=[], <BR>i=0, <BR>len=arr.length; <BR>if(typeof prop=='string') { <BR>for(; i<len; i++){ <BR>var oI = arr[i]; <BR>(props[i] = new String(oI && oI[prop] || ''))._obj = oI; <BR>} <BR>} <BR>else if(typeof prop=='function') { <BR>for(; i<len; i++){ <BR>var oI = arr[i]; <BR>(props[i] = new String(oI && prop(oI) || ''))._obj = oI; <BR>} <BR>} <BR>else { <BR>throw '参数类型错误'; <BR>} <BR>props.sort(); <BR>for(i=0; i<len; i++) { <BR>ret[i] = props[i]._obj; <BR>} <BR>if(desc) ret.reverse(); <BR>return ret; <BR>}; <BR>for(var i=0;i<1000;i++){ <BR>document.write('<div>a'+i+'</script>
')
}
var els=document.getElementsByTagName('div');
var cards=getRandomPlayCard(els.length);
var randomEls=[];
for(var i=0,len=cards.length;ialert(['总数:',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]);


Array原生的sort,当它传一个比较函数时,由于它内部用哪种排序算法,都需要多次比对,所以,耗时是很自然的事。
上面的快速排序,它并没有多次比对,
而是:
1。取出el属性值,用属性值产生一个String对象,
2。将el附在String对象上。
3。用String对象组成数组。
4。用原生的sort进String对象数组排序。
5。在排好序的String数组中,按序取出el。
即得到排好序的el数组。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn