数组随机排列

今天项目中用到数据随机排列,感觉应该很简单,结果一下子没想起来好的方法,上网搜索一下,感觉写的都好复杂,不过根据其中的一些思路写了下面这段。

整体思路是:随机一个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         }

 

posted @ 2019-03-13 20:37  猪猪快冲  阅读(417)  评论(0编辑  收藏  举报