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中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
Dec 25 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
ECMAScript6 新特性范例大全
Mar 24 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
react实现换肤功能的示例代码
Aug 14 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
深入浅析vue全局环境变量和模式
Apr 28 Javascript
40行代码把Vue3的响应式集成进React做状态管理
May 20 Javascript
Javascript confirm多种使用方法解析
Sep 25 Javascript
vue3.0 加载json的方法(非ajax)
Oct 26 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
JS实现滑动插件
2020/01/15 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Random 在 Python 中的使用方法
2018/08/09 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
解析python实现Lasso回归
2019/09/11 Python
python tkinter组件使用详解
2019/09/16 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
《巨人的花园》教学反思
2014/02/12 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
婚内房产协议书范本
2014/10/02 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis