如何对两个嵌套数组按字符串键汇总累加数值
合并两个[字符串, 数值]结构数组并累加相同字符串的数值
给定两个由[字符串, 数值]组成的数组:
const first_arr = [["кстати", 1], ["скажем", 1], ["блин", 1], ["реально", 1], ["вообще", 1], ["допустим", 1], ["фактически", 1], ["получается", 1]]; const second_arr = [['кстати', 1], ['скажем', 2], ['реально', 3], ['вообще', 3], ['ладно', 5]];
需求是将相同字符串对应的数值累加,保留所有唯一字符串的元素,最终生成目标数组:
const final_arr = [["кстати", 2], ["скажем", 3], ["блин", 1], ["реально", 4], ["вообще", 4], ["допустим", 1], ["фактически", 1], ["получается", 1], ['ладно', 5]];
解决方案
高效实现(无严格顺序要求)
使用对象作为中间映射表处理累加,时间复杂度为O(n + m)(n、m为两个数组长度):
function mergeAndSumArrays(arr1, arr2) { const sumMap = {}; // 累加第一个数组的数值 for (const [key, val] of arr1) { sumMap[key] = (sumMap[key] ?? 0) + val; } // 累加第二个数组的数值 for (const [key, val] of arr2) { sumMap[key] = (sumMap[key] ?? 0) + val; } // 转换为目标数组格式 return Object.entries(sumMap); } // 调用示例 const result = mergeAndSumArrays(first_arr, second_arr); console.log(result);
保留原顺序的实现
如果需要严格匹配目标数组的元素顺序(原数组元素在前,新增元素在后),可以用数组遍历判断的方式:
function mergeAndSumPreserveOrder(arr1, arr2) { const result = [...arr1]; for (const [key, val] of arr2) { const existingItem = result.find(item => item[0] === key); if (existingItem) { existingItem[1] += val; } else { result.push([key, val]); } } return result; } // 调用示例 const orderedResult = mergeAndSumPreserveOrder(first_arr, second_arr); console.log(orderedResult);
内容的提问来源于stack exchange,提问作者Proger228
相关产品推荐
相关产品推荐

