【问题标题】:Map in Dart is replacing the values of previous keys with the last updated valueDart 中的 Map 正在用最后更新的值替换先前键的值
【发布时间】:2017-11-13 08:49:43
【问题描述】:

我实际上在 Dart 中使用 maps,但我无法弄清楚为什么我的示例中的 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() 方法的文档覆盖map floorDetails 中所有键的值

void addAll(
  Map<K, V> other
)

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

如果 other 的 key 已经在这个 map 中,它的值会被覆盖。

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

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

请,任何帮助将不胜感激。 非常感谢, 鲯鳅

【问题讨论】:

    标签: dart


    【解决方案1】:

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

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

    但下一次迭代的第一行是

    data2.clear();
    

    清除data2。这也清除了 floorDetails['floor1']` 的内容,因为它引用了相同的地图。

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

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

    到

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

    或在分配之前创建地图的副本

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

    Map 是一个对象,通过引用复制。只有像 bool、double、int 和 String 这样的原始类型会按值复制。

    【讨论】:

    • 或者你可以用new Map.from(data2)代替{}..addAll(data2)。
    • 对,这样更好。
    • 哇,太棒了,非常感谢@Günter Zöchbauer,在我试图找出问题所在很长一段时间以来,您为我节省了很多时间。
    • 不客气 :-)。很高兴听到这对你有用。
    猜你喜欢
    • 2012-02-18
    • 2023-01-02
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-03-20
    • 2018-12-05
    相关资源
    最近更新 更多