如何在dart中找到数组中对象的值的总和?

时间:2021-08-01 21:14:34

标签: arrays dart

我有一个如下所示的数组:

[{name: Cibo, quantity: 3}, 
{name: Cibo, quantity: 2}, 
{name: Invia Regalo, quantity: 3}, 
{name: Invia Regalo, quantity: 1}]

如何通过组合相同的名称找到这些对象的总数?

所以输出看起来像:

[
{name: Invia Regalo, quantity: 4},
{name: Cibo, quantity: 5},
]

我尝试过类似的方法,但在 Dart 中不起作用。

var categoryTotal = [];

    category.forEach((category) {
      print(category);
      var categ =
          categoryTotal.firstWhere((cat) => cat['name'] == category['name']);
      print("Category is $categ");
      if (categ != null) {
        categ['quantity'] += category['quantity'];
      } else {
        categoryTotal.add(category);
      }
    });
    print(categoryTotal);

2 个答案:

答案 0 :(得分:1)

我一般不推荐使用映射映射来处理包含不同类型值的对象。相反,使用类。它使编写类型安全的代码变得更加容易。

此外,当您有多行代码时,我不建议使用 .forEach() 方法,因为它会使阅读变得困难。相反,请使用 for-each 循环。

我制定了以下解决方案来处理您的地图列表。 sumMap 用于通过使用 Map 处理 quantity 的总和来提高代码效率。然后根据 sumMap:

创建结果
void main() {
  final array = [
    {'name': 'Cibo', 'quantity': 3},
    {'name': 'Cibo', 'quantity': 2},
    {'name': 'Invia Regalo', 'quantity': 3},
    {'name': 'Invia Regalo', 'quantity': 1},
  ];

  final sumMap = <String, int>{};
  for (final map in array) {
    sumMap.update(
      map['name']! as String,
      (sum) => sum + (map['quantity']! as int),
      ifAbsent: () => map['quantity']! as int,
    );
  }

  final result = [
    for (final entry in sumMap.entries)
      {'name': entry.key, 'quantity': entry.value}
  ];

  print(result);
  // [{name: Cibo, quantity: 5}, {name: Invia Regalo, quantity: 4}]
}

答案 1 :(得分:0)

您需要添加 orElse: () => null 以避免例外。因此,最终代码将如下所示:

var categoryTotal = [];

    category.forEach((category) {
      var categ = categoryTotal.firstWhere(
        (cat) => cat['name'] == category['name'],
        orElse: () => null,
      );
      if (categ != null) {
        categ['quantity'] += category['quantity'];
      } else {
        categoryTotal.add(category);
      }
    });
    print(categoryTotal);