Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 洗牌数组只返回数组的一部分_Javascript_Arrays_Shuffle - Fatal编程技术网

Javascript 洗牌数组只返回数组的一部分

Javascript 洗牌数组只返回数组的一部分,javascript,arrays,shuffle,Javascript,Arrays,Shuffle,我编写了一个函数,可以洗牌数组中的元素 function shuffle(arr) { var newarr = []; var oldarr = arr; for(var i = 0; i < arr.length; i++) { var index = Math.floor(Math.random() * arr.length); newarr.push(arr[index]); arr.splice(index, 1); } return

我编写了一个函数,可以洗牌数组中的元素

function shuffle(arr) {
  var newarr = [];
  var oldarr = arr;
  for(var i = 0; i < arr.length; i++) {
    var index = Math.floor(Math.random() * arr.length);
    newarr.push(arr[index]);
    arr.splice(index, 1);
  }
  return newarr;
}
函数洗牌(arr){
var newarr=[];
var oldarr=arr;
对于(变量i=0;i
出于某种原因,该函数只返回数组元素的一半。如果一个包含7个元素的数组被传递给它,它将返回4个元素。类似地,如果返回一个包含8个元素的数组


哪里出错了?

只需将数组的长度存储在变量中,并在for循环头中使用它,而不是
arr.length
。这条
var oldarr=arr
行在代码中没有任何作用

const arr=[1,2,3,4];
函数洗牌(arr){
var newarr=[];
常数长度=阵列长度;
对于(变量i=0;i有许多方法提供了正确有效的算法。在您的代码中,循环变量的增量最大为
arr.length
,但在每次迭代中,您都会使用
splice
来减小
length
,因此总的来说,
i
将只运行到原始长度的一半左右,因此,您的函数将返回一个大约为输入大小一半的数组

快速修复:使用
while
循环代替
for
循环:

while (arr.length) {
可选:为了使输入数组保持tact状态,请替换以下无用的赋值:

var oldarr = arr;
…随附副本声明:

arr = arr.slice();

arr.splice(索引1)每次都会减少数组的大小。1:在迭代过程中,修改数组的长度,这就是原因。你应该考虑实现一个能够高效地就地混洗,并对所有排列都有均匀分布的可能性,假设随机数生成器也是近似线性分布的(它是这样的)。不使用
i
,这是wierd…
for(var i=arr.length;i>=0;i--){