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 图片延迟加载并等比缩放插件
Nov 09 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
Jquery简单分页实现方法
Jul 24 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
BootStrap3中模态对话框的使用
Jan 06 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
React 组件中的 bind(this)示例代码
Sep 16 Javascript
js计算最大公约数和最小公倍数代码实例
Sep 11 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脚本中include文件出错解决方法
2008/11/20 PHP
PHP反向代理类代码
2014/08/15 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python读写csv文件方法详细总结
2019/07/05 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
大学生学习自我评价
2014/01/13 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
应届大专生求职信
2014/06/26 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
2014年档案室工作总结
2014/12/01 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
实习生个人总结范文
2015/02/28 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
ES6 解构赋值的原理及运用
2021/05/25 Javascript
python中的3种定义类方法
2021/11/27 Python
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL