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的初始化与对象构建之浅析
Apr 12 Javascript
使用jQuery jqPlot插件绘制柱状图
Dec 18 Javascript
有效提高JavaScript执行效率的几点知识
Jan 31 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
javascript实现的右下角弹窗实例
Apr 24 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
Vue监听数组变化源码解析
Mar 09 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
Dec 06 Javascript
详解vue+webpack+express中间件接口使用
Jul 17 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 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常量的详解
2013/06/09 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
PHP7匿名类用法分析
2016/09/26 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
python实现手机销售管理系统
2019/03/19 Python
Python Django 命名空间模式的实现
2019/08/09 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
绿色出行口号
2014/06/18 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
2019初中学生入团申请书
2019/06/27 职场文书