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 相关文章推荐
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
Nov 28 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
整理Javascript函数学习笔记
Dec 01 Javascript
jQuery删除当前节点元素
Dec 07 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
Apr 01 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
浅谈Vue数据响应
Nov 05 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
vue项目中实现缓存的最佳方案详解
Jul 11 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
Aug 17 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
Cookie 小记
2010/04/01 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
js date 格式化
2017/02/15 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python中的XML库4Suite Server的介绍
2015/04/14 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
《小石潭记》教学反思
2014/02/13 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
安阳殷墟导游词
2015/02/10 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
户外亲子活动总结
2015/05/08 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python