这只是我对数组在 JS 中的工作方式的误解。感谢 Nicholas Tower 的回答。原帖:标题:在 for 循环中使用函数修改二维数组的关闭问题。我有一个包含一组字符串 (rotationsSet) 的数组,我想用 8 个随机版本的旋转集填充另一个数组。我的二维数组最终用最后一组随机字符串填充了 8 次。我是 Web 开发人员和 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 shufflefunction 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 个与最后一个混洗数组对应的相同数组。
1 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
只有一行代码用于创建数组:
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];
添加回答
举报
0/150
提交
取消