JavaScript中实现最高效的数组乱序方法


Posted in Javascript onOctober 11, 2014

数组乱序的意思是,把数组内的所有元素排列顺序打乱。

常用的办法是给数组原生的sort方法传入一个函数,此函数随机返回1或-1,达到随机排列数组元素的目的。

arr.sort(function(a,b){ return Math.random()>.5 ? -1 : 1;});

这种方法虽直观,但效率并不高,经我测试,打乱10000个元素的数组,所用时间大概在35ms上下(firefox)

本人一直具有打破沙锅问到底的优良品质,于是搜索到了一个高效的方法。原文见此

if (!Array.prototype.shuffle) {

    Array.prototype.shuffle = function() {

        for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);

        return this;

    };

}

arr.shuffle();

此方法是为Array.prototype添加了一个函数,叫shuffle——不过叫什么名字不重要啦,重要的是他的效率。

拿我上面那个10000个元素的数组来测试,用这个方法乱序完成仅需要7,8毫秒的时间。

把数组元素增加10倍到100000来测试,第一种sort方法费时500+ms左右,shuffle方法费时40ms左右,差别是大大的。

完整测试代码:

var count = 100000,arr = [];

for(var i=0;i.5 ? -1 : 1;});

Array.prototype.sort.call(arr,function(a,b){ return Math.random()>.5 ? -1 : 1;});

document.write(arr+'

');

var t1 = new Date().getTime();

document.write(t1-t);
//以下方法效率最高

if (!Array.prototype.shuffle) {

    Array.prototype.shuffle = function() {

        for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);

        return this;

    };

}

var t = new Date().getTime();

arr.shuffle();

document.write('

'+arr+'

');

var t1 = new Date().getTime();

document.write(t1-t);

另外,大家有没有注意到shuffle代码里的for循环,他没有后半截!也就是只有for(..)却没有后面的{..},居然可以这样写!而且居然正常执行!好奇特,我得去博客园问问。

Javascript 相关文章推荐
Jquery同辈元素选中/未选中效果的实例代码
Aug 01 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
Jquery插件分享之气泡形提示控件grumble.js
May 20 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
Apr 07 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
几种经典排序算法的JS实现方法
Mar 25 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
详解Angular系列之变化检测(Change Detection)
Feb 26 Javascript
浅析js中mvvm模式实现的原理
Oct 06 Javascript
vue通过数据过滤实现表格合并
Nov 30 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 #Javascript
JavaScript定义变量和变量优先级问题探讨
Oct 11 #Javascript
JavaScript中获取鼠标位置相关属性总结
Oct 11 #Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 #Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 #Javascript
探讨js字符串数组拼接的性能问题
Oct 11 #Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 #Javascript
You might like
SONY SRF-M100的电路分析
2021/03/02 无线电
php桌面中心(二) 数据库写入
2007/03/11 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
JavaScript面向对象精要(上部)
2017/09/12 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
Python递归函数特点及原理解析
2020/03/04 Python
Django values()和value_list()的使用
2020/03/31 Python
Python通过format函数格式化显示值
2020/10/17 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
社团活动总结格式
2014/08/29 职场文书
医德考评自我评价
2014/09/14 职场文书
工作年限证明模板
2014/11/01 职场文书
城南旧事观后感
2015/06/11 职场文书
教师个人教学反思
2016/02/23 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers