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代码
Apr 01 Javascript
javascript中onclick(this)用法介绍
Apr 19 Javascript
javascript常用的正则表达式实例
May 15 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
推荐10 款 SVG 动画的 JavaScript 库
Mar 24 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
小程序组件之自定义顶部导航实例
Jun 12 Javascript
Jquery $.map使用方法实例详解
Sep 01 jQuery
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生成html文件方法总结
2014/12/01 PHP
php银联网页支付实现方法
2015/03/04 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python 实现字符串下标的输出功能
2020/02/13 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
教研处工作方案
2014/05/26 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
作文评语集锦
2014/12/25 职场文书
学校社团活动总结
2015/05/07 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
用Python创建简易网站图文教程
2021/06/11 Python