减少/过滤Dart中标测图的首选方法?

8ftvxx2r  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(133)

试图找到最简洁的方式来减少 dart 中的Map。寻找类似于JavaScript的Array.prototype.filter()的东西
有什么建议吗?下面的方法还有很多需要改进的地方:

Map ingredients = {
  'flour': '250g',
  'butter': '50g',
  'egg': 1,
  'water': '0.2l'
};

final flour = new Map.fromIterable(
  ingredients.keys.where((k) => ingredients[k] == '250g'),
  value: (k) => ingredients[k]
);

print(flour); // {flour: 250g}
azpvetkf

azpvetkf1#

在核心库中没有内置的Pairs支持。但是如果你发现自己经常做这种类型的事情,你可以写一个实用程序库。例如:

library pairs;

class Pair<K,V> {
  Pair(this.k, this.v)
    final K k;
    final V v;
    String toString() => '($k, $v)';
}

Iterable<Pair> asPairs(Map map) => map.keys.map((k) => new Pair(k, map[k]));

Map fromPairs(Iterable<Pair> pairs) => new Map.fromIterables(
    pairs.map((p) => p.k),
    pairs.map((p) => p.v));

然后,您可以像这样使用它:

import 'src/pairs.dart';

Map flour = fromPairs(asPairs(ingredients).where((p) => p.v == '250g'));

print(flour); // {flour: 250g}

也许这可以为quiver package(一组非核心实用程序)做出贡献。

w1jd8yoj

w1jd8yoj2#

现在有一个map属性可以获取所有Map entries
所以你可以:

void main() {
    Map ingredients = {
    'flour': '250g',
    'butter': '50g',
    'egg': 1,
    'water': '0.2l'
  };

  var flour = Map.fromEntries(
    ingredients
      .entries
      .where((e) => e.value == '250g'),
  );
  
  print(flour);
}

如果您对键值感兴趣,您可以使用e.key
关于reduce方法,您可以对过滤的条目List使用fold方法。

相关问题