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 相关文章推荐
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
JavaScript动态创建div属性和样式示例代码
Oct 09 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
Dec 12 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
Dec 20 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
webpack的pitching loader详解
Sep 23 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 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
深入了解php4(1)--回到未来
2006/10/09 PHP
基于PHP异步执行的常用方式详解
2013/06/03 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
在Python下尝试多线程编程
2015/04/28 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
python实现简易内存监控
2018/06/21 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
老师的检讨书
2014/02/23 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
八一建军节演讲稿
2014/09/10 职场文书
新郎接新娘保证书
2015/05/08 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby