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'
相关产品推荐
相关产品推荐

