应该是一个基本的方法,但是即使在检查了很多问答并尝试了很长一段时间后,我还是没有成功。
我想从每个包含 String 和 bool 的对象列表中生成
Map<String, bool>
。
如果我对现有地图进行转换,一切都会正常(
firstT
在下面的代码/输出中)。但是,以对象列表作为输入,转换结果 second1
看起来并不像预期的那样(与 firstT
相比)。 second2
和 third1
会在运行时(而不是之前)导致脚本错误。
如何获得预期结果?为什么我的方法不起作用?
void main() {
final Map<Object, Object> first = <Object, Object>{'a': true, 'b': false};
final Map<String, String> firstT = Map<String, String>.of(first.map((l,r)
=> MapEntry(l.toString(), r.toString())));
print ("$first - $firstT");
final abc = [[ABC("a", true), ABC("b", true)],[ABC("a", false), ABC("b", false)]];
final Map<dynamic, dynamic> second1 = Map<dynamic, dynamic>.fromIterable(abc[0].map((a)
=> MapEntry(a.id, a.isit)));
print("$second1");
final Map<dynamic, dynamic> third1 = Map<dynamic, dynamic>.from(abc[0].map((a)
{print("${a.id} ${a.isit}");
return MapEntry("a.id", true);
}) as Map );
print ("$third1");
final Map<String, bool> second2 = Map<String, bool>.fromIterable(abc[0].map((a)
=> MapEntry(a.id, a.isit)));
print("$second2");
}
class ABC {
ABC(this.id, this.isit);
final String id;
final bool isit;
}
输出
{a: true, b: false} - {a: true, b: false}
{MapEntry(a: true): MapEntry(a: true), MapEntry(b: true): MapEntry(b: true)}
Script error.
刚刚“发现”了一个新方法 -
fromEntries
这似乎可以完成工作,将对象列表转换为地图
final Map<String, bool> second3 = Map<String, bool>.fromEntries(abc[0].map((a)
=> MapEntry(a.id, a.isit)));
这里是评论中@jamesdlin 更容易阅读的版本
final Map<String, bool> second2 =
{for (final obj in abc[0]) obj.id: obj.isit};
我留下问题,以防它帮助其他人解决这个问题