如何对数组中同ID对象的Qty属性值进行求和合并?
嘿,这问题不难解决!我们可以用JavaScript的数组方法结合Map来高效处理每个coords分组下的items,实现相同ID的qty累加合并。直接上代码和说明:
解决方案
以下是完整的实现代码,逻辑清晰且不会修改原数组:
var COLLECTION = [ { "coords":[1335,2525], "items":[ {id: "boletus",qty: 1}, {id: "lepiota",qty: 3}, {id: "boletus",qty: 2}, {id: "lepiota",qty: 4}, {id: "carbonite",qty: 4}, ], }, { "coords":[1532,2889], "items":[ {id: "boletus",qty: 2}, {id: "lepiota",qty: 6}, {id: "boletus",qty: 1}, {id: "lepiota",qty: 4}, {id: "chamomile",qty: 4}, ], } ]; // 核心处理函数 const mergeItemsByQty = (collection) => { return collection.map(group => { // 用Map统计每个ID的总数量,键为ID,值为累加后的qty const qtyCounter = new Map(); group.items.forEach(item => { if (qtyCounter.has(item.id)) { qtyCounter.set(item.id, qtyCounter.get(item.id) + item.qty); } else { qtyCounter.set(item.id, item.qty); } }); // 把Map转换回目标格式的数组 const mergedItems = Array.from(qtyCounter, ([id, qty]) => ({ id, qty })); // 返回新的分组对象,保留原coords,替换为合并后的items return { ...group, items: mergedItems }; }); }; // 执行处理并输出结果 const mergedCOLLECTION = mergeItemsByQty(COLLECTION); console.log(mergedCOLLECTION);
代码逻辑拆解
- 遍历分组:用
Array.map()遍历每个coords分组,这样会返回新数组,不会污染原数据。 - 统计数量:使用
Map来存储每个ID对应的总qty——Map在处理字符串键时比普通对象更稳妥(比如ID包含特殊字符的场景),语义也更明确。遍历items时,若ID已存在就累加qty,不存在则初始化。 - 转换格式:用
Array.from()把Map直接转换成我们需要的{id, qty}结构数组。 - 保留原属性:用扩展运算符
...group保留原分组的coords属性,只替换掉items为合并后的结果。
预期输出
执行后你会得到如下结构的数组:
var COLLECTION = [ { "coords":[1335,2525], "items":[ {id: "boletus",qty: 3}, {id: "lepiota",qty: 7}, {id: "carbonite",qty: 4} ] }, { "coords":[1532,2889], "items":[ {id: "boletus",qty: 3}, {id: "lepiota",qty: 10}, {id: "chamomile",qty: 4} ] } ];
这种方法的时间复杂度是O(n)(n为所有items的总数),效率很高,而且逻辑易懂,后续维护也方便。
内容的提问来源于stack exchange,提问作者RogerHN
相关产品推荐
相关产品推荐

