gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:13:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com