Dart:将地图转换为对象列表

Mat*_*kao 38 dart flutter

做了几次谷歌搜索,没有任何有用的东西出现。在尝试做一些应该非常简单的事情时,我一直在打击一些错误。将诸如地图之类的地图转换为{2019-07-26 15:08:42.889861: 150, 2019-07-27 10:26:28.909330: 182}具有以下格式的对象列表:

class Weight {
  final DateTime date;
  final double weight;
  bool selected = false;

  Weight(this.date, this.weight);
}
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情: List<Weight> weightData = weights.map((key, value) => Weight(key, value));

toList()显然,没有地图的方法。到目前为止,我不喜欢 dart 中的地图。对象类型映射和映射函数之间的命名混乱。使互联网上的故障排除令人难以忍受。

yba*_*kos 81

继理查德·希普 (Richard Heap) 的上述评论之后,我会:

List<Weight> weightData =
  mapData.entries.map( (entry) => Weight(entry.key, entry.value)).toList();
Run Code Online (Sandbox Code Playgroud)

不要忘记调用toList,因为 Dartmap返回一种 Iterable。

  • 如果 Weight 有多个字段会发生什么? (2认同)

Vid*_*rom 11

List<Weight> weightData = List();

weights.forEach((k,v) => weightData.add(Weight(k,v))); 
Run Code Online (Sandbox Code Playgroud)

  • 对于任何映射调用条目,它都会为您提供一个 MapEntry 列表:weights.entries.map((e) =&gt; Weight(e.key,e.value)).toList() (3认同)

Rit*_*had 7

您还可以使用for集合来实现相同的目的。

var list = [for (var e in map.entries) FooClass(e.key, e.value)];
Run Code Online (Sandbox Code Playgroud)


小智 5

有时类型转换会失败,您可以通过执行以下操作来强制执行:

List<Weight> weightData =
  weightData.entries.map<Weight>( (entry) => Weight(entry.key, entry.value)).toList();
Run Code Online (Sandbox Code Playgroud)

我的项目中没有类型转换就无法工作的示例:

List<NetworkOption> networkOptions = response.data['data']['networks']
          .map<NetworkOption>((x) => NetworkOption.fromJson(x))
          .toList();
Run Code Online (Sandbox Code Playgroud)


atr*_*eon 5

entriesmap对象上使用属性

这将返回 aList类型MapEntry<key,value>

myMap.entries.map((entry) => "${entry.key} + ${entry.value}").toList();
Run Code Online (Sandbox Code Playgroud)


Vas*_*huk 5

细节

  • 颤动 1.26.0-18.0.pre.106

解决方案

/libs/extensions/map.dart

extension ListFromMap<Key, Element> on Map<Key, Element> {
  List<T> toList<T>(
          T Function(MapEntry<Key, Element> entry) getElement) =>
      entries.map(getElement).toList();
}
Run Code Online (Sandbox Code Playgroud)

用法

import 'package:myApp/libs/extensions/map.dart';

final map = {'a': 1, 'b': 2};
print(map.toList((e) => e.value));
print(map.toList((e) => e.key));
Run Code Online (Sandbox Code Playgroud)