javascript - 在另一个二维数组中复制打乱数组时出现问题

标签 javascript arrays reference copy deep-copy

编辑(已解决): 这只是我对 JS 中数组如何工作的误解。 感谢尼古拉斯·塔尔的回答。

原帖:

标题:在 for 循环中使用函数修改二维数组的闭包问题。

我有一个包含一组字符串 (rotationsSet) 的数组,我想用 8 个混洗版本的rotationsSet 填充另一个数组。 我的二维数组最终被最后一组随机字符串填充了 8 次。

我是网络开发和 JS 的新手,但从我读到的内容来看,这似乎是一个关闭问题。 我尝试在 initShuffledSets 函数中使用 forEach 循环而不是 for 循环,但最终得到相同的结果。

var numberOfCubes = 8;
var rotationsSet = [
    'rotateX(90deg)',
    'rotateX(-90deg)',
    'rotateY(90deg)',
    'rotateY(-90deg)',
    'rotateX(180deg)'
    ];

var shuffledRotationsSets = Array(numberOfCubes).fill(['']);

// Fisher-Yates array shuffle
function shuffle(array) {
    for (let i = array.length - 1; i > 0; i--) {
        let j = Math.floor(Math.random() * (i + 1)); 
        [array[i], array[j]] = [array[j], array[i]]; 
    }
}

function initShuffledSets() {
    for (let z = 0; z < shuffledRotationsSets.length; z++) { 
        shuffledRotationsSets[z] = rotationsSet;
        shuffle(shuffledRotationsSets[z]);
    }
}

initShuffledSets();

for循环中的console.log显示8个不同的数组(这就是我想要的),而for循环外部的控制台日志显示与最后一个洗牌数组相对应的8个相同的数组。

最佳答案

只需一行代码即可创建数组:

var rotationsSet = [
    'rotateX(90deg)',
    'rotateX(-90deg)',
    'rotateY(90deg)',
    'rotateY(-90deg)',
    'rotateX(180deg)'
];

其他所有内容都只是引用完全相同的数组。这行代码创建副本:

shuffledRotationsSets[z] = rotationsSet;

shuffledRotationsSets[0] 和 shuffledRotationsSets[1] 以及 shuffledRotationSets[2] 等都是完全相同的数组,只是引用方式不同。因此,稍后当您开始通过交换数组元素来改变数组时,引用该数组的任何内容都将“看到”更改。

如果你想要可以单独变异的独立数组,你需要复制它。要创建副本,有几个选项。您可以使用 array.slice():

shuffledRotationsSets[z] = rotationsSet.slice();

或者您可以创建一个数组文字并将旧数组传播到其中:

shuffledRotationsSets[z] = [...rotationsSet];

关于javascript - 在另一个二维数组中复制打乱数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258827/

相关文章:

Javascript ajax insidehtml 返回 html 输入

C# 匿名方法不会运行。未设置对象引用

java - 有没有办法在 Java 中传递方法引用?

javascript - $.ajax 中类似 $.get 的调用

javascript - 迭代两个设置的最小值和最大值之间的数字

javascript - 我如何最终在 Lambda 函数中返回 promise 的值?

php - 如何将一个数组中的子数组同步嵌套到另一个数组的子数组中?

c - 程序崩溃,无法解释原因?

将数组表示法转换为指针表示法

c++ - 在 C++ 中使用 const 引用参数访问函数成员的最佳实践