编辑(已解决): 这只是我对 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/