You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart/Flutter修改MapList索引0数据时索引1同步变化的问题及解决

为什么修改数组中一个对象的属性会影响另一个对象?如何仅修改目标对象?

问题原因

核心原因是JavaScript中对象与数组的引用传递特性:你的data数组里,group A和group B中的目标城市对象(比如CITY1)其实指向内存中的同一个对象。当你通过索引修改属性值时,本质是修改了这个共享对象的属性,所有指向该对象的引用都会同步看到变化,因此group B里的对应值也跟着被修改了。

这种情况一般是初始化data时的疏忽导致的——比如你可能先定义了一份城市数据,然后直接把这个数组/对象赋值给两个group的city属性,没有做独立拷贝,导致两个group共享同一份数据的引用。

解决方法

要实现仅修改group A的目标数据,需要确保目标对象是独立的,或者在修改前切断共享引用,以下是两种可行方案:

方案1:初始化时确保每个group的city数据独立

在创建data时,不为不同group复用同一个对象/数组引用,而是为每个group定义独立的城市数据:

const data = [
  {
    "group": "A",
    "direction": "N",
    "city": [
      {
        "city": "CITY1",
        "code": "001",
        "subCity": [
          { "subCityCode": "C1001", "member": "15" },
          { "subCityCode": "C1002", "member": "20" }
        ]
      },
      {
        "city": "CITY2",
        "code": "002",
        "subCity": [
          { "subCityCode": "C2001", "member": "42" },
          { "subCityCode": "C2002", "member": "65" }
        ]
      }
    ]
  },
  {
    "group": "B",
    "direction": "S",
    "city": [
      // 这里的CITY1是全新对象,与group A的CITY1无引用关联
      {
        "city": "CITY1",
        "code": "001",
        "subCity": [
          { "subCityCode": "C1001", "member": "21" },
          { "subCityCode": "C1002", "member": "47" }
        ]
      },
      {
        "city": "CITY2",
        "code": "002",
        "subCity": [
          { "subCityCode": "C2001", "member": "65" },
          { "subCityCode": "C2002", "member": "17" }
        ]
      }
    ]
  }
];

方案2:修改前对目标对象进行拷贝再修改

如果无法调整初始化逻辑,可以在修改前对目标对象做深拷贝,替换原引用后再修改:

// 简易深拷贝函数(不适用于含函数、Symbol、循环引用的对象)
const deepClone = obj => JSON.parse(JSON.stringify(obj));

// 拷贝group A中的CITY1对象
const clonedCity = deepClone(data[0]['city'][0]);
// 修改拷贝后的对象属性
clonedCity['subCity'][0]['member'] = 100;
// 替换原数组中的对象,切断共享引用
data[0]['city'][0] = clonedCity;

如果数据层级简单,也可以只针对需要修改的层级做浅拷贝,性能更优:

// 拷贝subCity数组,并修改目标元素
const clonedSubCity = [...data[0]['city'][0]['subCity']];
clonedSubCity[0] = {...clonedSubCity[0], member: 100};
// 替换原subCity数组
data[0]['city'][0]['subCity'] = clonedSubCity;

内容的提问来源于stack exchange,提问作者nnn'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:15:55