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操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
JavaScript数组迭代器实例分析
Jun 09 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
Vue.js结合bootstrap实现分页控件
Mar 10 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
浏览器事件循环与vue nextTicket的实现
Apr 16 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
Aug 21 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
jquery $.getJSON()跨域请求
2011/12/21 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
python pandas 时间日期的处理实现
2019/07/30 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
护理自我鉴定范文
2013/10/06 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
小学家长评语大全
2014/04/16 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
志愿服务心得体会
2016/01/15 职场文书