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

