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开发中因空格引发的错误
Nov 08 Javascript
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
Sep 13 Javascript
JavaScript学习笔记(一) js基本语法
Oct 25 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
May 08 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
javascript中递归函数用法注意点
Jul 30 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
Jan 25 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
JS 常用校验函数
2009/03/26 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python json模块使用实例
2015/04/11 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android