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最新动画教程+iso光盘下载
Jan 22 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
Nov 07 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
Sep 15 Javascript
Three.js利用dat.GUI如何简化试验流程详解
Sep 26 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
详解Vue用cmd创建项目
Feb 12 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
微信小程序实现签字功能
Dec 23 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP常用函数小技巧
2008/09/11 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
php生成图片验证码
2015/06/09 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
javascript hashtable实现代码
2009/10/13 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
儿童python练习实例
2018/05/27 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
python虚拟环境迁移方法
2019/01/03 Python
python实现数据分析与建模
2019/07/11 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
关于工作时间玩手机的检讨书
2014/09/18 职场文书
安全先进个人材料
2014/12/29 职场文书
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server