Dart:公共元素的总和作为一个单独的列表?

Dart: Sum of comman elements as an separate list?

在飞镖中。我有一份每月重复月的付款清单:

class Pay {
String month;
int amount;
}

final payments = [Pay("Jan",150),Pay("Jan",100),Pay("Mar",120),Pay("Mar",150)];

现在我的需求是,我需要通过添加普通月份付款来构建一个新列表,就像这样

[
Pay("Jan",250),
Pay ("Mar",270),
]

我在嵌套的 for 循环中完成了这个,但是代码在 Merge review 中被拒绝了

我需要尝试使用 Map Reduce 方法(例如 reduce、fold、expand 等)和排序代码量

请帮帮我

试试这个:

main() {
  final payments = [
    Pay("Jan", 150),
    Pay("Jan", 100),
    Pay("Mar", 120),
    Pay("Mar", 150)
  ];
  Map<String, int> map = {};
  for (var pay in payments) {
    map[pay.month] =
        map[pay.month] == null ? pay.amount : map[pay.month]! + pay.amount;
  }
  List<Pay> newPays = [];
  map.forEach((key, value) => newPays.add(Pay(key, value)));
  print(newPays); //[Pay(Jan, 250), Pay(Mar, 270)]
}

你可以像下面这样使用 foldMap<String, Pay> 来总结你遇到的元素。然后我们将此地图的值作为结果。

class Pay {
  String month;
  int amount;

  Pay(this.month, this.amount);

  @override
  String toString() => 'Pay($month, $amount)';
}

void main() {
  final payments = [
    Pay("Jan", 150),
    Pay("Jan", 100),
    Pay("Mar", 120),
    Pay("Mar", 150)
  ];

  final paymentsSumList = payments
      .fold<Map<String, Pay>>(
        {},
        (map, pay) => map
          ..update(pay.month, (sumPay) => sumPay..amount += pay.amount,
              ifAbsent: () => Pay(pay.month, pay.amount)),
      )
      .values
      .toList();

  print(paymentsSumList); // [Pay(Jan, 250), Pay(Mar, 270)]
}