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实现上传图片前的预览(TX的面试题)
Aug 20 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
Mac/Windows下如何安装Node.js
Nov 22 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
vue2 router 动态传参,多个参数的实例
Nov 10 Javascript
js+html5实现手机九宫格密码解锁功能
Jul 30 Javascript
js实现延迟加载的几种方法详解
Jan 19 Javascript
用webpack4开发小程序的实现方法
Jun 04 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 Javascript
Vue 请求传公共参数的操作
Jul 31 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实现paypal整合方法
2010/11/28 PHP
php按单词截取字符串的方法
2015/04/07 PHP
简单实现PHP留言板功能
2016/12/21 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
优化javascript的执行速度
2010/01/23 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python 高阶函数简单介绍
2021/02/19 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
EJB3.1都有哪些改进
2012/11/17 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
机械专业求职信范文
2014/07/15 职场文书
师德师风个人整改措施
2014/10/27 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
导师鉴定意见
2015/06/05 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python
MySQL数据库之存储过程 procedure
2022/06/16 MySQL