如何在JS/TS中统计对象数组重复项并添加amount属性
合并数组中的重复对象并统计数量
我有一个对象数组,其中存在重复对象,需要统计重复对象的数量,将统计结果存入其中一个重复对象的amount属性,并移除其他重复对象。
输入示例(简化版)
[ { "id": "fishing_rod", "emoji": "🎣", "description": "Used to go fishing.", "category": "fishing" }, { "id": "fishing_rod", "emoji": "🎣", "description": "Used to go fishing.", "category": "fishing" }, { "id": "pickaxe", "emoji": "⛏️", "description": "Used to go mining.", "category": "mining" } ]
期望输出
[ { "id": "fishing_rod", "emoji": "🎣", "description": "Used to go fishing.", "category": "fishing", "amount": 2 }, { "id": "pickaxe", "emoji": "⛏️", "description": "Used to go mining.", "category": "mining", "amount": 1 } ]
已尝试方案
我尝试了一些方法但未达成目标,目前仅能获取对象id与对应数量,代码如下:
const itemsArray = items.map((i) => i.id); // items 是输入数组 const itemsUnique = [...new Set(itemsArray)]; const itemsCount = itemsUnique.map((item) => [item, itemsArray.filter((i) => i === item).length])
输出结果:
[ [ "fishing_rod", 2 ], [ "pickaxe", 1 ] ]
但这并非我想要的结果,希望得到帮助。<3
解决方案
可以使用Array.reduce()方法实现,通过临时对象做映射,以id为键统计重复数量并合并对象:
const items = [ { "id": "fishing_rod", "emoji": "🎣", "description": "Used to go fishing.", "category": "fishing" }, { "id": "fishing_rod", "emoji": "🎣", "description": "Used to go fishing.", "category": "fishing" }, { "id": "pickaxe", "emoji": "⛏️", "description": "Used to go mining.", "category": "mining" } ]; const mergedItems = Object.values(items.reduce((acc, currentItem) => { // 检查当前id是否已在映射中 if (acc[currentItem.id]) { // 重复则增加数量 acc[currentItem.id].amount += 1; } else { // 不重复则复制原对象并初始化amount为1 acc[currentItem.id] = { ...currentItem, amount: 1 }; } return acc; }, {})); console.log(mergedItems);
逻辑说明
reduce()遍历输入数组,累加器acc是一个空对象,用于存储每个id对应的唯一对象。- 遍历每个对象时,若
id已存在于acc中,就给对应对象的amount加1;若不存在,则复制原对象并添加amount属性(初始值为1),存入acc。 - 最后用
Object.values()将acc中的值提取为数组,得到合并后的结果。
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

