Dart 如何克隆地图列表

Posted

技术标签:

【中文标题】Dart 如何克隆地图列表【英文标题】:Dart how to clone a List of Maps 【发布时间】:2019-12-17 23:09:01 【问题描述】:

我正在尝试从地图列表中获取多个值,但每当我更改新列表值时,它也会更改原始地图列表中的相同值。

如何正确克隆列表,以免发生这种情况?

final List<Map> entries = [
  'date': '2019-7-29', 'data': 85.0,
  'date': '2019-8-2', 'data': 85.0,
  'date': '2019-8-3', 'data': 85.0,
];

  List<Map> getSelected() 
    List<Map> obj = [];
    for (var i = 0; i < 2; i++) 
      obj.add(entries[i]);
      obj[i]['data'] = obj[i]['data'] * 2;
    
    return obj;
  

  selected = getSelected();

编辑:这是建议的,但似乎无法解决问题。我猜是因为对象是通过引用传递的。

  List<Map> getSelected(List<Map> arr) 
    List<Map> obj = [];
    for (var i = 0; i < 2; i++) 
      obj.add(arr[i]);
      obj[i]['data'] = obj[i]['data'] * 2;
    
    return obj;
  

  selected = getSelected(entries);

【问题讨论】:

【参考方案1】:
final List<Map> entries = [
      'date': '2019-7-29', 'data': 85.0,
      'date': '2019-8-2', 'data': 85.0,
      'date': '2019-8-3', 'data': 85.0,
    ];

List<Map> selected = new List<Map>();
entries.forEach((map) =>  selected.add(new Map.from(map)) );
selected.forEach((map) => map["data"] = map["data"] * 2 );

会解决你的问题。

【讨论】:

这看起来很有趣,但你的代码并没有像我的函数 getSelected() 那样做。您从 entires 获取值而不更改任何值。 这是在不共享相同地图引用的情况下克隆它的方法。您也可以使用它进行修改。在不同的步骤中考虑克隆和数据更新怎么样? entries.forEach((map) =&gt; entries2.add(new Map.from(map)) );entries2.forEach((map) =&gt; map["data"] = map["data"] * 2 ); 是的,这是一个很好的解决方案。如果您更新答案,使其与我的原始代码相同,我可以接受它作为最佳答案。

以上是关于Dart 如何克隆地图列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中克​​隆列表、地图或集合

如何在 dart 的地图中使用和存储列表?

如何在Dart中将列表转换为地图

使用 Dart 和 Flutter,我如何将动态小部件中的数据保存到另一个列表中的地图列表中

Dart 解析字符串包含地图列表 [重复]

如何在 Dart 中克​​隆对象(深拷贝)?