Javascript:将数组添加到二维数组时出现问题

标签 javascript arrays loops

我正在尝试对数组进行洗牌,并每次使用循环将洗牌集添加到 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

最佳答案

您只有一个一维数组对象,即 b。然后你不断地打乱并将相同对象引用添加到matrix:

 matrix[i]=b;

因此,即使您添加了这样的行,当您再次调用 shuffle 时,您仍会继续更改该添加的行。

您应该获取该数组的副本,以便将不同数组添加到矩阵中:

 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]);
}

关于Javascript:将数组添加到二维数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329745/

相关文章:

arrays - 一旦达到客户端选择的数字,Powershell 循环就会为变量分配一个值

java - 在 Java 中,在循环中调用字段访问器是否会在循环的每次迭代中创建新的引用?

c++ - 如何使用 break 语句停止内循环和外循环

javascript - 将字符串格式数组加载到数组中

javascript - 将给定值与多维数组进行比较

c++ - 如何初始化未知大小的多维 vector ,C++

c - C中的中止陷阱6错误

javascript - 如何找到特定字符串并根据字符进行替换?

Javascript如何分割或分解6位数字

javascript - 通过纯 javascript 执行此操作的更好方法