【问题标题】:Dart how to clone a List of MapsDart 如何克隆地图列表
【发布时间】: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);

【问题讨论】:

    标签: list dictionary flutter dart


    【解决方案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 );
    • 是的,这是一个很好的解决方案。如果您更新答案,使其与我的原始代码相同,我可以接受它作为最佳答案。
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2019-05-30
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多