如何合并同属性值的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
相关产品推荐
相关产品推荐

