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

二维数组按第二个元素分组求和问题及实现尝试

解决二维数组按指定元素分组求和的问题

嘿,我来帮你搞定这个数组求和的问题~你想把二维数组里第二个元素相同的项,把第一个数值累加起来得到新数组对吧?你尝试的排序后比较相邻元素的思路是可行的,不过我先给你一个更高效的实现方法,再帮你完成你原来的代码。

方法一:用对象映射实现(高效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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:23