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


Posted in Javascript onJanuary 31, 2011

按所推荐的程序在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数组。
Javascript 相关文章推荐
jQuery实现图片信息的浮动显示实例代码
Aug 28 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
AngularJS基础 ng-copy 指令实例代码
Aug 01 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
Aug 29 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
jQuery Form表单取值的方法
Jan 11 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
JavaScript实现计算多边形质心的方法示例
Jan 31 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
Apr 04 Javascript
javascript 节点排序 2
Jan 31 #Javascript
js自定义事件代码说明
Jan 31 #Javascript
jQuery帮助之筛选查找 children([expr])
Jan 31 #Javascript
jQuery find和children方法使用
Jan 31 #Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
Jan 31 #Javascript
基于jQuery实现表格数据的动态添加与统计的代码
Jan 31 #Javascript
jquery键盘事件介绍
Jan 31 #Javascript
You might like
PHP模板引擎SMARTY
2006/10/09 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
jquery提升性能最佳实践小结
2010/12/06 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python paramiko模块的使用示例
2018/04/11 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python读取文件名并改名字的实例
2019/01/07 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python中安装django模块的方法
2020/03/12 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
python中def是做什么的
2020/06/10 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
内衣营销方案
2014/03/15 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
祝寿主持词
2015/07/02 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python