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 相关文章推荐
删除重复数据的算法
Nov 23 Javascript
JavaScript中void(0)的具体含义解释
Feb 27 Javascript
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
Aug 01 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
Aug 21 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
Aug 21 Javascript
xcode中获取js文件的路径方法(推荐)
Nov 05 Javascript
JS异步加载的三种实现方式
Mar 16 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
详细分析Node.js 模块系统
Jun 28 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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python 命令行传入参数实现解析
2019/08/30 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
用python写PDF转换器的实现
2020/10/29 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
父亲追悼会答谢词
2014/01/17 职场文书
护士感人事迹
2014/05/01 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
2015年教师节广播稿
2015/08/19 职场文书