为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2021-08-26 14:36:29
这只是我对数组在 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];


查看完整回答
反对 回复 2021-08-26
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信