【问题标题】:Two arrays update together when I only want one to change [duplicate]当我只想更改一个数组时,两个数组一起更新[重复]
【发布时间】:2022-01-18 06:54:21
【问题描述】:

这是我的代码:

let rowValues = [];
let gridValues = [];
let testArray = [[1,1,1],[0,0,0],[1,1,1],[0,0,0],[1,1,1]];
let rows = 5;
let cols = 3;

for (let i = 0; i < rows; i++) {
    rowValues.length = [];

    for (let j = 0; j < cols; j++) {

        if (testArray[i][j] === 0) {
            rowValues.push(0);
        } else if (testArray[i][j] === 1) {
            rowValues.push(1);
        }
    }
    gridValues.push(rowValues);
}

问题在于 gridValues 数组在第一个 for 循环的第一次迭代后(一旦 i = 1)更新为 rowValues 数组。就好像它们变得联系在一起,当你更新一个时,另一个也会效仿。这是怎么回事??

我只想构建 rowValues 数组,然后将其推入 gridValues 数组以构建二维数组。但是当在下一次迭代开始时清除 rowValues 时,gridValues 也会被清除。

【问题讨论】:

  • 因为您将对 rowValues 的引用推送到 gridValues 中。最简单的解决方法是将 rowValues 的内容传播到 gridValues 中,而不是将 rowValues 的引用推送到 gridValues 中。 gridValues.push([...rowValues])

标签: javascript arrays for-loop nested-loops


【解决方案1】:

gridValues.push(rowValues)rowValues引用 插入gridValues。由于您执行该命令 5 次(每行一次),相同的引用被插入 5 次,这解释了为什么结果包含最后一行数据的 5 个副本[1,1,1]。当您使用rowValues.length = [] 重置数组时,您已插入gridValues 的引用将指向新值。

您可以通过将第 18 行替换为使用扩展语法推送数组的 副本 的以下内容来避免此问题:

gridValues.push([...rowValues]);

另外,我不确定您想要实现什么 - 也许您设计了您的示例 - 但如果您只是想克隆数组 testArray 则不需要 for 循环或 .push()完全是因为你可以在上面使用扩展语法:

const testArray = [[1,1,1],[0,0,0],[1,1,1],[0,0,0],[1,1,1]];
const gridValues = [...testArray];

【讨论】:

  • 感谢您的精彩解释!我对 JS 很陌生,直到现在我才知道传播语法!非常感谢 :) 是的,testArray 是人为设计的,真正的输入数组是从图形数据动态生成的。我刚刚创建了一个已知的测试输入来敲定这个特定的功能。再次感谢朋友!
【解决方案2】:
gridValues.push(JSON.parse(JSON.stringify(rowValues))

【讨论】:

  • 这确实提供了一个有效的答案(解决了问题)。这绝对是回答问题的诚实尝试。然而,由于它是一个纯代码的答案,并且没有涉及为什么建议的代码有效,它被认为是一个低质量的答案。 @CinCout 请不要查看您不熟悉的技术的答案。
【解决方案3】:

改变

rowValues.length = [];

rowValues = [];

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2021-10-18
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多