在另一个二维数组中复制混洗数组的问题

这只是我对数组在 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 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 个与最后一个混洗数组对应的相同数组。


ABOUTYOU
浏览 139回答 1
1回答

慕娘9325324

只有一行代码用于创建数组:var rotationsSet = [&nbsp; &nbsp; 'rotateX(90deg)',&nbsp; &nbsp; 'rotateX(-90deg)',&nbsp; &nbsp; 'rotateY(90deg)',&nbsp; &nbsp; 'rotateY(-90deg)',&nbsp; &nbsp; 'rotateX(180deg)'];其他一切都只是引用完全相同的数组。这行代码并不会创建一个副本:shuffledRotationsSets[z] = rotationsSet;shuffledRotationsSets[0] 和 shuffledRotationsSets[1] 以及 shuffledRotationSets[2] 等都是完全相同的数组,只是引用方式不同。因此,稍后当您开始通过交换元素来改变数组时,任何引用该数组的内容都将“看到”更改。如果你想要可以单独变异的独立数组,你需要复制它。要创建副本,有几个选项。您可以使用 array.slice():shuffledRotationsSets[z] = rotationsSet.slice();或者您可以创建一个数组文字并将旧数组扩展到其中:shuffledRotationsSets[z] = [...rotationsSet];
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript