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中:button选择器用法实例
Jan 04 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
javascript截取字符串小结
Apr 28 Javascript
JS中处理时间之setUTCMinutes()方法的使用
Jun 12 Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 Javascript
详解vue-Resource(与后端数据交互)
Jan 16 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 Javascript
Thinkjs3新手入门之如何使用静态资源目录
Dec 06 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 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
phpMyadmin 用户权限中英对照
2010/04/02 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
php实现微信公众号无限群发
2015/10/11 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
python语言使用技巧分享
2016/05/31 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
Python使用openpyxl复制整张sheet
2021/03/24 Python
毕业晚会主持词
2014/03/24 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
协议书的格式
2014/04/23 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
爱的教育观后感
2015/06/17 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书