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 相关文章推荐
js css后面所带参数含义介绍
Aug 18 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
javascript教程:关于if简写语句优化的方法
May 17 Javascript
JavaScript中匿名函数的递归调用
Jan 22 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
基于JavaScript实现报警器提示音效果
Oct 27 Javascript
原生js+cookie实现购物车功能的方法分析
Dec 21 Javascript
Javascript防止图片拉伸的自适应处理方法
Dec 26 Javascript
vue+vuex+axios实现登录、注册页权限拦截
Mar 09 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 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制作静态网站的模板框架(一)
2006/10/09 PHP
基于header的一些常用指令详解
2013/06/06 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
php查询及多条件查询
2017/02/26 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
php多进程应用场景实例详解
2019/07/22 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
李开复演讲稿
2014/05/24 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
导游词欢迎词
2015/02/02 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
公司员工辞职信范文
2015/05/12 职场文书
2015年预算员工作总结
2015/05/14 职场文书
初中军训感言
2015/08/01 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书