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

如何对含重复项的二维数组按首元素匹配累加第4位元素值?

问题说明

之前看到的多数相关实现示例,都仅支持处理包含2个元素的数组合并去重场景。现在需要调整实现逻辑,完成以下二维数组处理需求:

  • 比对规则:*以二维数组每个子数组的首元素(索引为0)*作为重复判定依据
  • 合并规则:匹配到重复项时,对重复子数组的*第4位元素(索引为3,即数值位)*做求和计算
  • 保留规则:重复项仅保留首次出现的子数组条目,删除其余重复条目,将求和后的值更新到保留条目的对应数值位

待处理原始数组

const array = [
   [2, 'name1','something',15],
   [3, 'name10','something',5],
   [5, 'name20','something',20],
   [2, 'name15','something',3]
]

预期处理结果

const resultArray = [
   [2, 'name1','something',18],
   [3, 'name10','something',5],
   [5, 'name20','something',20]
]
实现调整方案

原有针对2元素数组的实现核心逻辑是「通过判定键建立映射、遇到重复项就执行值合并」,这套逻辑完全可以复用,只需要调整3处细节即可适配当前二维数组场景:

  • 调整判定键取值逻辑:不再取固定位置的简单值作为键,直接读取每个子数组索引为0的元素作为去重判定的唯一键
  • 调整值合并逻辑:遇到同键重复项时,不做值覆盖或字符串拼接,直接将重复项索引为3的数值,累加到映射中已存在条目的对应索引位上
  • 调整结果输出逻辑:不再仅拼接键和合并后的值生成结果,直接将映射表中存储的完整子数组条目转为数组,就是最终处理结果

可直接运行的参考代码

function merge2DArray(arr) {
  const tempMap = new Map()
  for (const subItem of arr) {
    const matchKey = subItem[0]
    if (tempMap.has(matchKey)) {
      // 命中重复项,累加对应位置的数值
      tempMap.get(matchKey)[3] += subItem[3]
    } else {
      // 首次出现的条目存入映射,做浅拷贝避免修改原始输入数组
      tempMap.set(matchKey, [...subItem])
    }
  }
  return Array.from(tempMap.values())
}

// 测试验证
const testArray = [
   [2, 'name1','something',15],
   [3, 'name10','something',5],
   [5, 'name20','something',20],
   [2, 'name15','something',3]
]
console.log(merge2DArray(testArray))
// 输出结果与预期完全一致:[[2, "name1", "something", 18], [3, "name10", "something", 5], [5, "name20", "something", 20]]

说明:如果不需要保留原数组不被修改,存入映射时可以直接存储原数组项的引用,不需要做展开拷贝;如果后续需要调整判定位、求和位的位置,只需要修改代码中对应的索引值即可,整体逻辑不需要改动。


内容的提问来源于stack exchange,提问作者onit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:21:47