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 tools之tooltip
Jul 25 Javascript
js 创建快捷方式的代码(fso)
Nov 19 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
Jun 24 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
移动手机APP手指滑动切换图片特效附源码下载
Nov 30 Javascript
javascript中的后退和刷新实现方法
Nov 10 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
Sep 05 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
JavaScript 空间坐标的使用
Aug 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP修改session_id示例代码
2014/01/08 PHP
2014过年倒计时示例
2014/01/31 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
使用python模拟命令行终端的示例
2019/08/13 Python
django的autoreload机制实现
2020/06/03 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
幼儿园教研工作总结2015
2015/05/12 职场文书
安全第一课观后感
2015/06/18 职场文书
初婚初育证明范本
2015/06/18 职场文书
团队拓展训练心得体会
2016/01/12 职场文书