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 相关文章推荐
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
javascript函数声明和函数表达式区别分析
Dec 02 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
Mar 28 Javascript
简介AngularJS的HTML DOM支持情况
Jun 17 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
Underscore源码分析
Dec 30 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
jQuery实现图片轮播效果代码
Sep 27 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
对node.js中render和send的用法详解
May 14 Javascript
Vant 中的Toast设置全局的延迟时间操作
Nov 04 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 字符转义 注意事项
2009/05/27 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
python pytest进阶之fixture详解
2019/06/27 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
用python制作个视频下载器
2021/02/01 Python
出纳岗位职责模板
2013/11/27 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
商场促销活动策划方案
2014/08/18 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
铣工实训报告
2014/11/05 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
java代码实现空间切割
2022/01/18 Java/Android
Python装饰器详细介绍
2022/03/25 Python