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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:15:40