Javascript 在另一个二维数组中复制无序数组的问题

Javascript 在另一个二维数组中复制无序数组的问题,javascript,arrays,reference,copy,deep-copy,Javascript,Arrays,Reference,Copy,Deep Copy,编辑(已解决): 这只是我对数组如何在JS中工作的误解。 感谢尼古拉斯·托尔的回答 原创帖子: 标题:使用for循环中的函数修改二维数组的闭包问题 我有一个包含一组字符串(RotationSet)的数组,我想用RotationSet的8个无序版本填充另一个数组。 我的2D数组最后用最后一组随机字符串填充了8次 我对web开发和JS还不熟悉,但从我所读到的内容来看,这似乎是一个关闭问题。 我尝试在initShuffledSets函数中使用forEach循环而不是for循环,但结果相同 var nu

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

原创帖子:

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

我有一个包含一组字符串(RotationSet)的数组,我想用RotationSet的8个无序版本填充另一个数组。 我的2D数组最后用最后一组随机字符串填充了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 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();
var numberOfCubes=8;
变量旋转集=[
“旋转度(90度)”,
“rotateX(-90度)”,
“旋转(90度)”,
“旋转(-90度)”,
‘旋转度(180度)’
];
var shuffledRotationsSets=数组(numberOfCubes).fill(['']);
//费舍尔·耶茨阵列洗牌
函数洗牌(数组){
对于(设i=array.length-1;i>0;i--){
设j=Math.floor(Math.random()*(i+1));
[array[i],array[j]=[array[j],array[i]];
}
}
函数initShuffledSets(){
对于(设z=0;z

for循环中的console.log显示8个不同的数组(这是我想要的),而for循环外的console.log显示8个相同的数组,与上一个无序排列的数组相对应。

创建数组的代码只有一行:

var rotationsSet = [
    'rotateX(90deg)',
    'rotateX(-90deg)',
    'rotateY(90deg)',
    'rotateY(-90deg)',
    'rotateX(180deg)'
];
其他一切都只是引用了完全相同的数组。这行代码不会创建副本:

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

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

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

shuffledRotationsSets[z] = [...rotationsSet];
非常感谢:)我对这一点还不熟悉,不了解可能的问题是什么
shuffledRotationsSets[z] = [...rotationsSet];