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 面向对象之重载
May 04 Javascript
jquery调用wcf并展示出数据的方法
Jul 07 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
javascript alert乱码的解决方法
Nov 05 Javascript
js检测网络是否具体连接功能的代码
May 23 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
Bootstrap每天必学之媒体对象
Nov 30 Javascript
关于动态执行代码(js的Eval)实例详解
Aug 15 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
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
也谈截取首页新闻 - 范例
2006/10/09 PHP
php 操作调试的方法
2012/07/12 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
2017/01/04 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python操作文件的参数整理
2019/06/11 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Python super()方法原理详解
2020/03/31 Python
详解python的super()的作用和原理
2020/10/29 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
公司门卫岗位职责
2014/03/15 职场文书
拔河比赛口号
2014/06/10 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
病人慰问信范文
2015/02/15 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL