二维数组按第二个元素分组求和问题及实现尝试
解决二维数组按指定元素分组求和的问题
嘿,我来帮你搞定这个数组求和的问题~你想把二维数组里第二个元素相同的项,把第一个数值累加起来得到新数组对吧?你尝试的排序后比较相邻元素的思路是可行的,不过我先给你一个更高效的实现方法,再帮你完成你原来的代码。
方法一:用对象映射实现(高效O(n)复杂度)
这种方法不需要排序,直接通过对象的键值对来记录每个分组的总和,步骤很清晰:
- 创建一个空对象,用来存储每个字符串对应的数值总和
- 遍历原数组,把每个项的第二个元素作为键,第一个元素累加到对应的值里
- 最后把对象转换成目标格式的二维数组
代码示例:
const array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']]; const sumMap = {}; // 遍历数组,累加每个分组的数值 array.forEach(item => { const [value, key] = item; // 如果键已存在就累加,不存在就初始化 sumMap[key] = (sumMap[key] || 0) + value; }); // 将对象转换为目标二维数组(调换顺序让数值在前) const finalResult = Object.entries(sumMap).map(([key, total]) => [total, key]); console.log(finalResult); // 输出:[[5, 'name'],[8, 'lastname']]
方法二:完成你原本的排序后遍历思路
如果你坚持想用排序后比较相邻元素的方式,我帮你把代码补全。这种方法需要先按第二个元素排序,然后遍历的时候合并相同分组的数值:
代码示例:
const array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']]; // 先按第二个元素的字母顺序排序 const sortedArray = [...array].sort((a, b) => a[1].localeCompare(b[1])); const result = []; for (let n = 0; n < sortedArray.length; n++) { let currentTotal = sortedArray[n][0]; const currentKey = sortedArray[n][1]; // 检查下一个元素是否和当前key相同,相同就累加并跳过该元素 while (n + 1 < sortedArray.length && sortedArray[n + 1][1] === currentKey) { currentTotal += sortedArray[n + 1][0]; n++; } result.push([currentTotal, currentKey]); } console.log(result); // 输出:[[5, 'name'],[8, 'lastname']]
两种方法对比:
- 方法一的时间复杂度是O(n),只需要遍历一次数组,效率更高,适合处理大数据量的数组
- 方法二因为多了排序步骤,时间复杂度是O(n log n),但好处是最终结果会自动按字母顺序排列,如果你需要有序的结果,这个方法更直接
内容的提问来源于stack exchange,提问作者Merim
相关产品推荐
相关产品推荐

