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 应用 JQuery.groupTable.js
Dec 15 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
May 03 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
javascript与css3动画结合使用小结
Mar 11 Javascript
js实现图片上传并正常显示
Dec 19 Javascript
实例讲解jQuery中对事件的命名空间的运用
May 24 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
Bootstrap 按钮样式与使用代码详解
Dec 09 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php时间不正确的解决方法
2008/04/09 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
用python实现对比两张图片的不同
2018/02/05 Python
django框架模板语言使用方法详解
2019/07/18 Python
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
心理健康教育心得体会
2013/12/29 职场文书
教师个人剖析材料
2014/02/05 职场文书
教师个人读书活动总结
2014/07/08 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript