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

Dart/Flutter中移除列表重复项并统计合并数量

合并数组中重复对象的数量并去重

给定一个包含name和qty字段的对象数组,需要移除重复的对象(以name为判断依据),并将所有重复对象的qty值累加合并到保留的那一项中。

原始数据

var data = [
  {
    name: "book",
    qty: 1
  },
  {
    name: "book",
    qty: 1
  },
  {
    name: "book",
    qty: 1
  },
  {
    name: "pen",
    qty: 1
  },
  {
    name: "pen",
    qty: 1
  },
];

期望结果

[{name: "book", qty: 3}, {name: "pen", qty: 2}]

解决方案1:使用reduce方法

这是最简洁的实现方式,利用reduce构建临时对象统计数量,再转换为数组:

const mergedData = Object.values(data.reduce((acc, item) => {
  if (acc[item.name]) {
    acc[item.name].qty += item.qty;
  } else {
    acc[item.name] = {...item}; // 复制对象避免修改原数据
  }
  return acc;
}, {}));

代码说明

  • reduce遍历数组,参数acc是累加器,初始值为空对象。
  • 每遍历一个对象,判断acc中是否已有该name的条目:
    • 有则累加qty值;
    • 无则将当前对象的副本存入acc(用扩展运算符...避免影响原数组的对象)。
  • 最后用Object.values()将临时对象的取值转为数组,得到去重并合并数量的结果。

解决方案2:使用Map对象

如果更习惯使用Map结构,也可以用以下方式实现:

const itemMap = new Map();
data.forEach(item => {
  if (itemMap.has(item.name)) {
    const existingItem = itemMap.get(item.name);
    existingItem.qty += item.qty;
  } else {
    itemMap.set(item.name, {...item});
  }
});
const mergedData = Array.from(itemMap.values());

代码说明

  • Map的键具有唯一性,刚好用来按name去重。
  • 遍历数组时,检查Map中是否存在对应name:
    • 存在则取出已有对象累加qty;
    • 不存在则存入新的对象副本。
  • 用Array.from(itemMap.values())将Map中的值转换为目标数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:22:38