You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中对数组内对象按同名属性合并并计算quantity总和

问题原因

你原有代码无法运行的核心问题是 Dart的firstWhere方法默认找不到匹配元素时会直接抛出StateError,不会返回null,因此你后续的categ != null判断逻辑完全无法生效。

正确实现方案

推荐使用Map作为临时中转存储,时间复杂度更低(仅为O(n)),实现逻辑如下:

void main() {
  // 你的输入数组
  List<Map<String, dynamic>> categories = [
    {"name": "Cibo", "quantity": 3},
    {"name": "Cibo", "quantity": 2},
    {"name": "Invia Regalo", "quantity": 3},
    {"name": "Invia Regalo", "quantity": 1},
  ];

  // 临时Map存储每个name对应的累计quantity
  Map<String, int> tempMap = {};
  for (var item in categories) {
    String name = item['name'];
    int quantity = item['quantity'] as int;
    tempMap[name] = (tempMap[name] ?? 0) + quantity;
  }

  // 将Map转换为你需要的目标数组格式
  List<Map<String, dynamic>> categoryTotal = tempMap.entries.map((entry) {
    return {"name": entry.key, "quantity": entry.value};
  }).toList();

  // 输出验证,需要自定义排序可以自行调整数组顺序
  print(categoryTotal);
}

运行后输出结果和期望完全一致:

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

如果你一定要沿用原有遍历判断的逻辑,只需给firstWhere补充orElse参数,找不到匹配项时返回null即可,修改后代码如下:

List<Map<String, dynamic>> categoryTotal = [];
categories.forEach((category) {
  // 补充orElse参数,未找到匹配项返回null
  var categ = categoryTotal.firstWhere(
    (cat) => cat['name'] == category['name'],
    orElse: () => null,
  );
  if (categ != null) {
    categ['quantity'] += category['quantity'];
  } else {
    // 这里拷贝新对象添加,避免修改原数组数据影响结果
    categoryTotal.add(Map.from(category));
  }
});
print(categoryTotal);

内容的提问来源于stack exchange,提问作者wrerhty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:24:02