如何在JavaScript二维数组中合并重复项并求和,补全非重复元素?
数组按元素分组求和的优化方案
问题场景
给定二维数组:
const products = [ ["orange", 1], ["apple", 2], ["apple", 1], ["lemon", 1], ["lemon", -1], ];
需要按子数组第一个元素识别重复项,对第二个元素求和,最终得到:
newArray = [ ["orange", 1], ["apple", 3], ["lemon", 0], ];
现有代码仅输出有重复项的结果(缺少['orange', 1]),且实现逻辑繁琐,需要优化。
现有代码的问题
原代码将水果名和数量拆分到两个单独数组,通过filter仅处理重复出现的元素(即fruits.indexOf(item)!== index的情况),完全遗漏了只出现一次的元素。同时这种写法只能处理重复两次的场景,若某个元素出现多次,计算逻辑会直接出错。
简化实现方案
推荐使用Map或普通对象来完成分组求和,逻辑清晰且能覆盖所有场景:
方案一:使用Map(保留原数组元素顺序)
const products = [ ["orange", 1], ["apple", 2], ["apple", 1], ["lemon", 1], ["lemon", -1], ]; // 用Map存储每个水果的累计数量 const sumMap = new Map(); products.forEach(([name, qty]) => { // 若Map中无当前水果,默认取0,加上当前数量后存入 sumMap.set(name, (sumMap.get(name) || 0) + qty); }); // 将Map的键值对转换为目标二维数组 const newArray = Array.from(sumMap.entries()); console.log(newArray);
方案二:使用普通对象(ES6+同样保留插入顺序)
const products = [ ["orange", 1], ["apple", 2], ["apple", 1], ["lemon", 1], ["lemon", -1], ]; const sumObj = {}; products.forEach(([name, qty]) => { sumObj[name] = (sumObj[name] || 0) + qty; }); // 将对象的键值对转换为二维数组 const newArray = Object.entries(sumObj); console.log(newArray);
这两种方案都能一次性处理所有元素,不管是只出现一次还是多次重复的项,逻辑简洁且不易出错。
内容的提问来源于stack exchange,提问作者Jorgefilemon
相关产品推荐
相关产品推荐

