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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
可以文本显示的公告栏的js代码
Mar 11 Javascript
javascript数组操作方法小结和3个属性详细介绍
Jul 05 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
JS实现的Unicode编码转换操作示例
Apr 28 Javascript
js is_valid_filename验证文件名的函数
Jul 19 Javascript
js实时监控文本框输入字数的实例代码
Jan 18 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
浅谈Vuex注入Vue生命周期的过程
May 20 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
May 11 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php实现的日历程序
2015/06/18 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
国际贸易专业推荐信
2013/11/15 职场文书
城管综合整治方案
2014/05/01 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
新闻编辑求职信
2014/07/13 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
慰问信(范文3篇)
2019/10/23 职场文书