我实际上map在 Dart 中使用s 并且我无法弄清楚为什么map我的示例中的变量表现得很奇怪,或者我在我的代码中做错了什么。
请有人帮我调试代码,我已经发布了代码来重现问题。
例子.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);
}
Run Code Online (Sandbox Code Playgroud)
代码的输出是:
floorDetails = {
floor1: {
flat201: {flattype: flat},
flat202: {flattype: flat}
},
floor2: {
flat201: {flattype: flat},
flat202: {flattype: flat}
}
}
Run Code Online (Sandbox Code Playgroud)
其实我期待输出是:
floorDetails = {
floor1: {
flat101: {flattype: flat},
flat102: {flattype: flat}
},
floor2: {
flat201: {flattype: flat},
flat202: {flattype: flat}
}
}
Run Code Online (Sandbox Code Playgroud)
这实际上map floorDetails是根据Map.addAll()方法文档覆盖了所有键的值
Run Code Online (Sandbox Code Playgroud)void addAll( Map<K, V> other )将 other 的所有键值对添加到此映射中。
如果 other 的键已在此映射中,则其值将被覆盖。
该操作相当于对
this[key] = value其他中的每个键和关联值进行操作。它迭代其他,因此在迭代期间不能改变。
尽管在给定的示例中键不同,但它仍在覆盖值。
请,任何帮助将不胜感激。非常感谢,马希
在第一次迭代中,您在这里分配 data2
floorDetails['floor${(i+1)}'] = data2;
Run Code Online (Sandbox Code Playgroud)
但下一次迭代的第一行是
data2.clear();
Run Code Online (Sandbox Code Playgroud)
这清除了data2。这也清除了 floorDetails['floor1']` 的内容,因为它引用了相同的地图。
要么创建一个新地图,而不是通过更改来清除它
data2.clear();
data1.clear();
Run Code Online (Sandbox Code Playgroud)
到
data2 = {}; // or new Map()
data1 = {};
Run Code Online (Sandbox Code Playgroud)
或在分配之前创建地图的副本
floorDetails['floor${(i+1)}'] = new Map.from(data2);
Run Code Online (Sandbox Code Playgroud)
Map 是一个对象,通过引用复制。只有像bool, double, int, and这样的原始类型String是按值复制的。
| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |