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 相关文章推荐
Javascript Request获取请求参数如何实现
Nov 28 Javascript
JavaScript中的字符串操作详解
Nov 12 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
angularJS模态框$modal实例代码
May 27 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
vue-router的两种模式的区别
May 30 Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 Javascript
JS性能优化实现方法及优点进行
Aug 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
django中的ajax组件教程详解
2018/10/18 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Selenium的使用详解
2018/10/19 Python
python画环形图的方法
2020/03/25 Python
情人节活动策划方案
2014/02/27 职场文书
闭幕式主持词
2014/04/02 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python