sort排序法(最简单的打乱数组顺序的方法)
原理:
利用sort用法:arr.sort(compareFunction)
如果 compareFunction(a,b) 返回的值大于 0 ,则 b 在 a 的前边;
如果 compareFunction(a,b) 返回的值等于 0 ,则a 、b 位置保持不变;
如果 compareFunction(a,b) 返回的值小于 0 ,则 a 在 b 的前边。
let arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
arr.sort(() => Math.random() - 0.5);
刚刚看了文章《常用的sort打乱数组方法真的有用?》,才发现原来此种方法的缺陷,误导了大家,对不起!下边是《常用的sort打乱数组方法真的有用?》文章中提供的一种正确的sort打乱数组的用法。
正确使用方法:
let arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
function shuffle(arr) {
let i = arr.length;
while (i) {
let j = Math.floor(Math.random() * i--);
[arr[j], arr[i]] = [arr[i], arr[j]];
}
return arr;
}
shuffle(arr);
循环随机位交换法(最容易理解的打乱数组顺序的方法)
原理:
循环遍历该数组,在每次遍历中产生一个0 ~ length - 1的数,该数代表本次循环要随机交换的位置。
将本次循环当前位置的数和随机位置的数进行交换。
let arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
for(let i = 0,len = arr.length; i < len; i++){
let currentRandom = parseInt(Math.random() * (len - 1));
let current = arr[i];
arr[i] = arr[currentRandom];
arr[currentRandom] = current;
}
循环随机位法(循环次数最多的打乱数组顺序的方法)
原理:
创建一个新的数组保存打乱的变量;
每次循环产生一个随机位,将随机位的数保存至新数组中;
查询新数组中是否存在随机位的数,如果不存在,就保存,如果存在就重新循环该次循环。
let arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],newArr = [];
for(let i = 0,len = arr.length; i < len;){
i++;
let currentRandom = parseInt(Math.random() * len);
if (!newArr.includes(arr[currentRandom])){
newArr.push(arr[currentRandom]);
}else{
i--;
}
}
总结
方法一个人推荐,高效、简单!相对只要对sort函数理解,就能快速理解。sort函数详解
方法二比较容易让人理解,简单说就是每次产生一个随机位,将当前位和随机位进行交换。
方法三不推荐使用,循环次数太多,消耗内存。
下载
我的博客,欢迎交流!
我的CSDN博客,欢迎交流!
微信小程序专栏
前端笔记专栏
微信小程序实现部分高德地图功能的DEMO下载
微信小程序实现MUI的部分效果的DEMO下载
微信小程序实现MUI的GIT项目地址
微信小程序实例列表
前端笔记列表
游戏列表