Javascript:将数组添加到2D数组时出现问题

时间:2019-10-10 19:17:30

标签: javascript arrays loops

我正在尝试对数组进行混洗,并使用循环将混洗的集每次添加到2D数组中。 问题在于,生成的2D数组的所有行都包含相同的改组集合,而每个改组集合的输出均不同。

所以;我在这里想念什么?

var b=[1,2,3,4,5,6,7,8,9];
var matrix=[];

for(var i=0; i <5; i ++){
    shuffle(b);
    matrix[i]=b;
    //matrix.push(b);
    console.log(b);
}
console.log(matrix);


function shuffle(array) {
    var ctr = array.length, temp, index;
    while (ctr > 0) {
        index = Math.floor(Math.random() * ctr);
        ctr--;
        temp = array[ctr];
        array[ctr] = array[index];
        array[index] = temp;
    }
    return array;
}

输出:

Array(9) [ 7, 3, 4, 9, 2, 1, 6, 8, 5 ]
Array(9) [ 5, 6, 3, 9, 8, 4, 1, 7, 2 ]
Array(9) [ 9, 5, 2, 4, 3, 6, 8, 7, 1 ]
Array(9) [ 3, 5, 2, 1, 4, 9, 6, 8, 7 ]
Array(9) [ 5, 9, 4, 6, 7, 3, 2, 8, 1 ]

(5) […]
0: Array(9) [ 5, 9, 4, … ]
1: Array(9) [ 5, 9, 4, … ]
2: Array(9) [ 5, 9, 4, … ]
3: Array(9) [ 5, 9, 4, … ]
4: Array(9) [ 5, 9, 4, … ]
length: 5

2 个答案:

答案 0 :(得分:1)

您只有一个1D数组对象,即b。然后,您不断改组并将 same 对象引用添加到matrix

 matrix[i]=b;

因此,即使您添加了这样的行,当您再次调用shuffle时,也将保持对添加的行进行变异。

您应该复制阵列的副本,以便将具有不同的阵列添加到matrix

 matrix[i]=b.slice();

有几种获取副本的方法:b.slice()也可以是Array.from(b)[...b]

或者,您可以将b的初始化作为新数组放在 循环中:

var matrix = [];
for (var i = 0; i < 5; i++){
    var b = [1,2,3,4,5,6,7,8,9];
    shuffle(b);
    matrix[i] = b;
}

由于您设计了shuffle还可以返回数组,因此可以将上面的代码简化为:

var matrix = [];
for(var i = 0; i < 5; i++){
    matrix[i] = shuffle([1,2,3,4,5,6,7,8,9]);
}

答案 1 :(得分:1)

您可以将随机播放混为一谈。

 for(var i=0; i <5; i ++){
    const clone = {...shuffle(b)};
    matrix[i]=clone;
    //matrix.push(b);
    console.log(clone);
}
console.log(matrix);