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 Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
jquery 单击li防止重复加载的实现代码
Dec 24 Javascript
js 页面关闭前的出现提示的实现代码
May 25 Javascript
jquery 选项卡效果 新手代码
Jul 08 Javascript
js 函数调用模式小结
Dec 26 Javascript
jQuery对下拉框,单选框,多选框的操作
Feb 21 Javascript
JavaScript判断文件上传类型的方法
Sep 02 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
浅谈React + Webpack 构建打包优化
Jan 23 Javascript
vue如何将v-for中的表格导出来
May 07 Javascript
JS新手入门数组处理的实用方法汇总
Apr 07 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
实现树状结构的两种方法
2006/10/09 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
phpwind放自动注册方法
2006/12/02 Javascript
Prototype使用指南之range.js
2007/01/10 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
js 走马灯简单实例
2013/11/21 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
react MPA 多页配置详解
2019/10/18 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
python实现决策树分类算法
2017/12/21 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python openpyxl使用方法详解
2019/07/18 Python
python已协程方式处理任务实现过程
2019/12/27 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
《画家乡》教学反思
2014/04/22 职场文书
护士工作失误检讨书
2014/09/14 职场文书
诚信承诺书
2015/01/19 职场文书