当我只想更改一个数组时,两个数组一起更新[重复]

Posted

技术标签:

【中文标题】当我只想更改一个数组时,两个数组一起更新[重复]【英文标题】: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]) 【参考方案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 = [];

【讨论】:

以上是关于当我只想更改一个数组时,两个数组一起更新[重复]的主要内容,如果未能解决你的问题,请参考以下文章

划分并行数组C ++ [重复]

当我只想获取字典中的特定值时,如何解码字典值的 JSON 数组?

从 mongodb 数组中的所有重复项中拉出一个元素

Laravel插入或更新数组,多行

当我的@Published NSManagedObjects 数组更改时,我的 SwiftUI 列表不会更新

如何使用 AlamoFire 搜索 JSON API 和解码数组