如何在Dart中将List转换为Map

时间:2013-05-30 08:39:40

标签: list map dart

我正在寻找一种现成的方式将List转换为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函数需要一对夫妇的List。对于每对,第一个元素用作键,第二个元素用作数据。

在Dart中,我看到了List的以下方法: asMap(),但它没有按照我的预期进行:它使用列表索引作为键。 我的问题:

  • 您是否知道Dart库中的任何内容可以执行此操作?
  • 如果没有,是否计划在核心库中添加此类功能?

提案:

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.

谢谢和问候,

尼古拉斯

7 个答案:

答案 0 :(得分:38)

在Dart 1.1中,您可以使用Map的this constructor

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

这最接近您的原始提案。

答案 1 :(得分:9)

对于 Dart 2.3 及更高版本,

有很多解决方案,但最简单的是:

1- 使用 asMap() 函数

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

输出:

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

2- 在地图中使用 for-in 集合 Map map = {};

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

输出:

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

希望能帮到你。

答案 2 :(得分:5)

没有这样的方法,我认为没有任何计划添加这样的功能。如果您认为这很重要,可以file an issue

List.asMap文档是:

  

返回this的不可修改的Map视图。

     

它将此列表的索引作为键,将相应的元素作为值。

但是,你可以这样做:

Map dict(List l) {
  final m = {};
  l.forEach((e){ m[e[0]] = e[1]; });
  return m;
}

main(){
  print(dict([["a", "b"], ["c", "d"]])); // prints {a: b, c: d}
}

答案 3 :(得分:2)

另一种可能性是使用Map.fromEntries()构造函数:

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

答案 4 :(得分:2)

这可能与答案没有直接关系,但是,如果有人想要转换。

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

像地图一样,

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

你可以使用

var map = list.asMap();

附注

此地图不可编辑

答案 5 :(得分:1)

详情

  • 颤振 1.26.0-18.0.pre.106

解决方案

<块引用>

/libs/extensions/list.dart

document.addEventListener('DOMContentLoaded', ()=>{
  const list = document.querySelector('.list'); // why get it again
  getLibrary();
  let row;
  for(let b of myLibrary){ // I like this kind of loop since you can break out of it if needed
    row = document.createElement('tr'); // new instance at each step of loop
    row.innerHTML = `<td>${b.title}</td>
      <td>${b.author}</td>
      <td>${b.pages}</td>
      <td>${b.read}</td>
      <td><a href="#" class="btn delete">X</a></td>`;
    }
    list.appendChild(row);
  }
});

用法

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)));
}

答案 6 :(得分:0)

dart中没有元组或对的概念(除了两个元素Iterable之外)。如果Dart有这样的概念,那么issue 7088建议用Map.fromPairs构造函数解决这个问题。