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 切换不同图片示例代码
Dec 05 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
ActiveX控件与Javascript之间的交互示例
Jun 04 Javascript
浅谈JavaScript Array对象
Dec 29 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
详细谈谈AngularJS的子级作用域问题
Sep 05 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
js实现鼠标跟随运动效果
Aug 02 Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
原生JS实现京东查看商品点击放大
Dec 21 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
浅谈PHP语法(1)
2006/10/09 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
python实现简单的五子棋游戏
2020/09/01 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
Viking比利时:购买办公用品
2019/10/30 全球购物
init进程的作用
2015/08/20 面试题
2015年元旦文艺汇演主持词
2014/03/26 职场文书
同学聚会策划方案
2014/06/06 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书