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实例教程(19) 使用HoTMetal(7)
Dec 23 Javascript
JS 继承实例分析
Nov 04 Javascript
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
JavaScript File API文件上传预览
Feb 02 Javascript
Bootstrap Paginator分页插件使用方法详解
May 30 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
JS原型链怎么理解
Jun 27 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
layui实现根据table数据判断按钮显示情况的方法
Sep 26 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 Javascript
Vue数字输入框组件使用方法详解
Feb 10 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图片上传程序
2008/03/27 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
php ios推送(代码)
2013/07/01 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
全面了解js中的script标签
2016/07/04 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
js图片上传的封装代码
2017/08/01 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
详解Python验证码识别
2016/01/25 Python
python 排序算法总结及实例详解
2016/09/28 Python
python实现飞机大战游戏
2020/10/26 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
python如何实现图片压缩
2020/09/11 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
入股协议书
2014/04/14 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
建筑结构施工求职信
2014/07/11 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
先进党组织事迹材料
2014/12/26 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python