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

如何合并同属性值的JavaScript对象并对其余属性值累加求和

代码问题分析

  • 累加变量totalNumberOfStudents定义在了内层k循环内部,每次遍历原数组元素都会被重置为0,无法完成同一个学校学生数的累加
  • outputArray.push操作放在了匹配判断的内部,每匹配到一个同校对象就会新增一条记录,导致同一个学校生成多个对象,而不是累加完成后仅生成一条记录

修复后的代码(基于你的原有逻辑修改)

let listOfUniqueSchools = [];
for (let i = 0; i < schools.length; i++) {
  if (!listOfUniqueSchools.includes(schools[i].school)) {
    listOfUniqueSchools.push(schools[i].school);
  }
}

let outputArray = [];
for (let j = 0; j < listOfUniqueSchools.length; j++) {
  // 累加变量移到外层,每个学校初始化一次
  let totalNumberOfStudents = 0;
  for (let k = 0; k < schools.length; k++) {
    if (listOfUniqueSchools[j] == schools[k].school) {
      totalNumberOfStudents += schools[k].students;
    }
  }
  // 遍历完该学校所有记录后,再统一push
  outputArray.push({
    school: listOfUniqueSchools[j],
    students: totalNumberOfStudents,
  });
}

更简洁的实现方案(使用Array.reduce)

可以直接用对象做映射一次遍历完成,时间复杂度更低:

const result = Object.values(schools.reduce((acc, cur) => {
  // 已存在该学校则累加人数,不存在则初始化
  acc[cur.school] = acc[cur.school] 
    ? {...acc[cur.school], students: acc[cur.school].students + cur.students}
    : {...cur}
  return acc
}, {}))

运行上述两种代码都可以得到你预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:08