如何过滤地图/访问条目

And*_*ers 9 dart

Map接口似乎不提供对可迭代条目的访问,也没有公开where方法来过滤条目.我错过了什么吗?有一个简单的解决方法吗?

例如

Map map;
final filteredMap = map.where((k, v) => k.startsWith("foo"));
Run Code Online (Sandbox Code Playgroud)

And*_*ázi 6

添加了Dart 2.0.0 removeWhere,可用于过滤Map实体。给定您的示例,您可以将其应用为:

Map map;
final filteredMap = Map.from(map)..removeWhere((k, v) => !k.startsWith("foo"));
Run Code Online (Sandbox Code Playgroud)

这不是where您要求的方法,但是通过这种方式过滤Map实体当然是可行的。

  • 也许这不是你所说的完美答案,但它真的很适合我,谢谢! (2认同)
  • “..”是什么?我刚刚学习,发现不可能找到它。如果有人能阐明这一点,我将不胜感激。 (2认同)
  • @lost-and-found 这是级联表示法:https://dart.dev/guides/language/language-tour#cascade-notation- (2认同)

Gün*_*uer 5

您可以使用

library x;

void main(List<String> args) {
  Map map = {'key1': 'aölsjfd', 'key2': 'oiweuwrow', 'key11': 'oipoip', 'key13': 'werwr'};

  final filteredMap = new Map.fromIterable(
      map.keys.where((k) => k.startsWith('key1')), key: (k) => k, value: (k) => map[k]);

  filteredMap.forEach((k, v) => print('key: $k, value: $v'));
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是一个相当不错的解决方法。我仍然觉得地图上确实缺少该功能,因此我添加了https://code.google.com/p/dart/issues/detail?id=16117 (3认同)
  • 您可以避免使用默认的`key:(k)=&gt; k`。 (2认同)

Jan*_*sen 5

由于 Dart 2.0 Maps 有一个条目 getter 返回一个,Iterable<MapEntry<K, V>>因此您可以执行以下操作:

MapEntry theOne = map.entries.firstWhere((entry) {
        return entry.key.startsWith('foo');
      }, orElse: () => MapEntry(null, null));
Run Code Online (Sandbox Code Playgroud)