如何对对象数组调用reduce方法,按指定属性名分组求和对应字段数值
问题诊断
- 变量名不匹配:你定义的数组变量为
population(小写p开头),reduce调用时写的是全大写的POPULATION,会直接触发未定义引用报错 - 分组判断逻辑错误:累加器初始为空数组,存储的是人口数值,你用
indexOf判断县名是否存在的逻辑完全不成立,永远返回-1,最终只会把每一条数据的男女和单独推入数组,没有做同县的累加操作 - 缺少同县累加逻辑:就算县名判断正确,你现有逻辑只在第一次遇到该县时加了当前条目的数值,同县后续条目完全没有触发累加的分支
正确实现
用对象作为累加器做分组统计,后续可以根据需要转成数组格式:
let population = [{ "county": "Bomi", "district": "Dowein", "male": 6589, "female": 6599 }, { "county": "Bomi", "district": "Klay", "male": 11884, "female": 11513 }, { "county": "Lofa", "district": "Senjeh", "male": 15442, "female": 14585 }, { "county": "Lofa", "district": "Suehn Mecca ", "male": 9025, "female": 8482 }] // 分组统计 const countyMap = population.reduce((acc, curr) => { const county = curr.county const currTotal = curr.male + curr.female // 已存在该分组就累加,不存在就初始化 acc[county] = acc[county] ? acc[county] + currTotal : currTotal return acc }, {}) // 如果需要输出[{县名: 总人口}]的数组格式可以加下面这步 const countyPopTotal = Object.entries(countyMap).map(([county, total]) => ({ county, totalPopulation: total })) console.log(countyPopTotal) /* 输出结果: [ { county: 'Bomi', totalPopulation: 36585 }, { county: 'Lofa', totalPopulation: 47534 } ] */
内容的提问来源于stack exchange,提问作者Benjamin A. Ngafua
相关产品推荐
相关产品推荐

