如何在 Dart 中将 List 转换为 Map

我寻找一个 现成的的方式转换一个名单成一个地图在 Dart。

例如,在 python 中,你可以做到:

l= [ ('a',(1,2)), ('b',(2,3)), ('c',(3,4) ) ]
d=dict(l)
==> {'a': (1, 2), 'c': (3, 4), 'b': (2, 3)}

Dict 函数需要一个夫妇列表。对于每个耦合,第一个元素用作键,第二个元素用作数据。

在 Dart 中,我看到了 List 的以下方法: AsMap (),但它没有完成我期望的工作: 它使用 List 索引作为键。 我的问题是:

  • 你知道 Dart 图书馆里有什么可以做到这一点的吗?
  • 如果没有,有没有计划在 core lib 中添加这样一个特性?

建议:

List.toMap() //same as python dict.
List.toMap( (value) => [ value[0], value[1] ] ) //Using anonymous function to return a key and a value from a list item.

谢谢并致以问候,

尼古拉斯

70206 次浏览

You can use Map.fromIterable:

var result = Map.fromIterable(l, key: (v) => v[0], value: (v) => v[1]);

or collection-for (starting from Dart 2.3):

var result = { for (var v in l) v[0]: v[1] };

There is not yet a concept of tuples or pairs in dart (other than a two element Iterable). If Dart had such a concept, then issue 7088 proposes to solve this with a Map.fromPairs constructor.

In Dart 1.1, you can use this constructor of Map:

new Map.fromIterable(list, key: (v) => v[0], value: (v) => v[1]);

This would be closest to your original proposal.

Another possibility is to use the Map.fromEntries() constructor:

final result = Map.fromEntries(l.map((value) => MapEntry(value[0], value[1])));

This may not directly relevant to the answer but, if there is anyone who wants to convert.

var list = ['fee','fi','fo','fum'];

to a Map like,

var map = {0:'fee', 1:'fi', 2:'fo', 3:'fum'};

you can use

var map = list.asMap();

PS

This map is not editable

Details

  • Flutter 1.26.0-18.0.pre.106

Solution

/libs/extensions/list.dart

extension MapFromList<Element> on List<Element> {
Map<Key, Element> toMap<Key>(
MapEntry<Key, Element> Function(Element e) getEntry) =>
Map.fromEntries(map(getEntry));


Map<Key, Element> toMapWhereKey<Key>(Key Function(Element e) getKey) =>
Map.fromEntries(map((e) => MapEntry(getKey(e), e)));
}

Usage

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


final list = [1,2,3,4];
print(list.toMap((e) => MapEntry(e-1, e)));  // {0: 1, 1: 2, 2: 3, 3: 4}
print(list.toMapWhereKey((e) => "str $e"));  // {str 1: 1, str 2: 2, str 3: 3, str 4: 4}

For Dart 2.3 and more ,

There are many solutions, but the simplest are :

1- Use the asMap() function

List list = ['steve', 'bill', 'musk'];
Map map = list.asMap();
print(map);

Output :

{0: steve, 1: bill, 2: musk}

2- Use for-in collection inside your map Map map = {};

List list = ['steve', 'bill', 'musk'];
Map map = {for (var item in list) '$item' : 'valueOf$item'};
print(map);

Output :

{steve: valueOfsteve, bill: valueOfbill, musk: valueOfmusk}

Hope it will be helpful .

this is how you can convert list into map

void main() {
var list = [99, 25, 45, 11, 5, 125, 50];
SplayTreeMap numbers = new SplayTreeMap<int, int>();
numbers.addAll(list.asMap());
print(numbers);
}