如何在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
相关产品推荐
相关产品推荐

