Dart 中的 Map 正在用最后更新的值替换先前键的值

Mah*_*ahi 3 dart

我实际上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()方法文档覆盖了所有键的值

void addAll(
  Map<K, V> other
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

请,任何帮助将不胜感激。非常感谢,马希

Gün*_*uer 5

在第一次迭代中,您在这里分配 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是按值复制的。

  • 或者您可以使用 `new Map.from(data2)` 而不是 `{}..addAll(data2)`。 (3认同)