合并列表重复项:按ID汇总价格与数量的Dart实现需求
合并Dart列表中相同ID的Model并累加字段值
我们需要处理一个Dart的Model列表,将其中ID相同的项合并,合并时对price字段求和、count字段累加,最终得到去重且字段累加后的新列表。
原代码定义
class Model{ int id, price, count; Model(this.id, this.price, this.count); } List<Model> list1 = [ Model(1, 5000, 10), Model(2, 1000, 20), Model(1, 5000, 5), Model(2, 5000, 10), ]; List<Model> list2 = [];
期望结果
list2 = [ Model(1, 10000, 15), Model(2, 6000, 30), ];
解决方案1:循环+Map分组(直观写法)
通过Map按ID分组,遍历原列表时累加对应字段值:
Map<int, Model> groupedMap = {}; for (var item in list1) { if (groupedMap.containsKey(item.id)) { // 对已有ID的Model字段进行累加 final existingModel = groupedMap[item.id]!; existingModel.price += item.price; existingModel.count += item.count; } else { // 新ID直接存入Map groupedMap[item.id] = Model(item.id, item.price, item.count); } } // 将Map中的合并结果转为目标列表 list2 = groupedMap.values.toList();
解决方案2:fold方法(简洁写法)
用fold方法一次性完成分组与字段累加:
list2 = list1.fold<Map<int, Model>>({}, (map, item) { map[item.id] = map.containsKey(item.id) ? Model( item.id, map[item.id]!.price + item.price, map[item.id]!.count + item.count ) : Model(item.id, item.price, item.count); return map; }).values.toList();
核心逻辑说明
两种方式本质逻辑一致:
- 以ID为唯一标识,将相同ID的Model聚合到同一组
- 对组内Model的
price求和、count累加 - 将聚合后的结果转换为列表,得到最终的
list2
内容的提问来源于stack exchange,提问作者Elham Moshiri
相关产品推荐
相关产品推荐

