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

合并列表重复项:按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();

核心逻辑说明

两种方式本质逻辑一致:

  1. 以ID为唯一标识,将相同ID的Model聚合到同一组
  2. 对组内Model的price求和、count累加
  3. 将聚合后的结果转换为列表,得到最终的list2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:31:15