数组随机排列
今天项目中用到数据随机排列,感觉应该很简单,结果一下子没想起来好的方法,上网搜索一下,感觉写的都好复杂,不过根据其中的一些思路写了下面这段。
整体思路是:随机一个0-数组长度之间的整数作为下标,从数组中取出该下标下的数据存在一个新的数组中,并从该数组中移除,while循环数组长度即可。代码如下:
1 function sort(list) { 2 var result = []; 3 var arr2 = list.concat(); 4 while (arr2.length) { 5 var len = arr2.length; 6 var index = Math.floor(Math.random() * len); 7 result.push(arr2.splice(index, 1)[0]); 8 console.log(len); 9 } 10 return result; 11 } 12 13 //下面是举例应用,数组arr中依次有1-10这10个数字 14 var arr = []; 15 for (let i = 0; i < 10; i++) { 16 arr.push(i + 1); 17 } 18 console.log(sort(arr).toString());//输出这个数组中随机排列的数字
上面的代码也能实现乱序的效果,但过程中会创建大量的数组,有点心疼那一点内存,同时不会改变原数组,下面的方法是目前所有乱序方法中最简单,效率最高,性能也最好的方法,可以作为参考使用,直接上代码讲解
1 /** 2 * 数组乱序排列(默认不会改变原有数组),循环一个数组的长度就可以搞定 3 * @param arr 需要乱序的数组对象 4 * @param changeSource 是否改变原有数组,默认false,不会改变 5 */ 6 function randomAry(arr, changeSource) { 7 let list = changeSource ? arr : arr.slice(); 8 let len = list.length; 9 let temp; 10 while (len) { 11 let index = Math.floor(Math.random() * len); 12 len = len - 1; 13 if (index == len) continue; 14 //交换位置 15 temp = list[len]; 16 list[len] = list[index]; 17 list[index] = temp; 18 } 19 return list; 20 }