Map in Dart正在用上次更新的值替换以前关键帧的值

  • 本文关键字:替换 关键帧 更新 Dart in Map dart
  • 更新时间 :
  • 英文 :


我实际上在Dart中使用map,我不明白为什么示例中的map变量行为异常,或者我在代码中做错了什么。

请有人帮我调试代码,我已经发布了代码来重现这个问题。

example.dart

void main() {
var data2 = {};
var data1 = {};
var floorDetails = new Map();
floorDetails.clear();
for (int i = 0; i < 2; i++) {
data2.clear();
data1.clear();
for (int j = 0; j < 2; j++) {
data1 = {
'flat${(i + 1) * 100 + (j + 1)}': {'flattype': "flat"},
};
data2.addAll(data1);
}
print('data2=$data2');
floorDetails['floor${(i+1)}'] = data2;
print('floorDetails = $floorDetails');
}
print(floorDetails.keys);
}

代码的输出为:

floorDetails = {
floor1: {
flat201: {flattype: flat}, 
flat202: {flattype: flat}
},
floor2: {
flat201: {flattype: flat},
flat202: {flattype: flat}
}
}

事实上,我原以为输出是:

floorDetails = {
floor1: {
flat101: {flattype: flat},
flat102: {flattype: flat}
}, 
floor2: {
flat201: {flattype: flat}, 
flat202: {flattype: flat}
}
}

这实际上是根据Map.addAll()方法的文档覆盖mapfloorDetails内所有密钥的值

void addAll(
Map<K, V> other
)

将other的所有键值对添加到此映射。

如果other的键已经在此映射中,则其值将被覆盖。

该操作相当于对每个键和其他键中的关联值执行this[key] = value。它对其他的进行迭代,因此在迭代过程中不能改变。

尽管在给定的示例中键不同,但它仍然覆盖值。

请帮忙,我们将不胜感激。非常感谢,Mahi

在第一次迭代中,在这里分配data2

floorDetails['floor${(i+1)}'] = data2;

但下一次迭代的第一行是

data2.clear();

其清除CCD_ 8。这也会清除floorDetails['floor1']`的内容,因为它引用了相同的映射。

要么你创建一个新地图,而不是通过更改来清除它

data2.clear();
data1.clear();

data2 = {}; // or new Map()
data1 = {};

或者在指定之前创建地图的副本

floorDetails['floor${(i+1)}'] = new Map.from(data2);

Map是一个对象,通过引用进行复制。只有像booldoubleintString这样的基元类型才会按值复制。

最新更新