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 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
jquery图片滚动放大代码分享(1)
Aug 25 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
Apr 27 Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
使用Vue自定义指令实现Select组件
May 24 Javascript
快速了解Node中的Stream流是什么
Feb 13 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
Sep 18 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
如何利用vue实现波谱拟合详解
Nov 05 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正确配置mysql(apache环境)
2011/08/28 PHP
php注销代码(session注销)
2012/05/31 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
Javascript与flash交互通信基础教程
2008/08/07 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
python获取外网ip地址的方法总结
2015/07/02 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
详解python分布式进程
2018/10/08 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
python字典按照value排序方法
2020/12/28 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
打架检讨书500字
2014/01/29 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
2014年共青团工作总结
2014/12/10 职场文书
单身申明具结书
2015/02/26 职场文书
开除员工通知
2015/04/22 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android