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 相关文章推荐
关于B/S判断浏览器断开的问题讨论
Oct 29 Javascript
学习ExtJS form布局
Oct 08 Javascript
JQuery自定义事件的应用 JQuery最佳实践
Aug 01 Javascript
Javascript继承机制的设计思想分享
Aug 28 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
Mar 12 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
Jul 13 Javascript
vue删除html内容的标签样式实例
Sep 13 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 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
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
PHP生成条形图的方法
2014/12/10 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
Javascript下的keyCode键码值表
2007/04/10 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
深入研究React中setState源码
2017/11/17 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python 数据的清理行为实例详解
2017/07/12 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
Python3爬虫全国地址信息
2019/01/05 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
班组安全员工作职责
2014/02/01 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
艾滋病宣传标语
2014/06/25 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
总账会计岗位职责
2015/04/02 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL