如何对含重复项的二维数组按首元素匹配累加第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
相关产品推荐
相关产品推荐

