使用Array.reduce统计选民分组时累加器二次循环变undefined报错
问题分析与解决方案
核心问题梳理
- reduce回调未返回累加器
Array.reduce的回调函数必须返回更新后的accumulator对象,否则下一次迭代时acc会变成undefined,导致无法读取属性报错。你的代码里回调函数没有return语句,第一次循环后acc就丢失了。 - 总人数统计逻辑错误
不管用户是否投票,都应该计入对应年龄段的总人数,但你的代码只在person.voted为true时才累加num${type}People,这会导致总人数统计不全。
修正后的完整代码
function voterResults(arr) { return arr.reduce( (acc, person) => { const type = person.age >= 18 && person.age <= 25 ? `Young` : person.age <= 55 ? `Mid` : `Old`; // 所有用户都计入对应年龄段总人数 acc[`num${type}People`]++; // 仅投票用户计入对应年龄段投票人数 if (person.voted) { acc[`num${type}VotesPeople`]++; } // 必须返回更新后的累加器,供下一次迭代使用 return acc; }, { numYoungVotesPeople: 0, numYoungPeople: 0, numMidVotesPeople: 0, numMidPeople: 0, numOldVotesPeople: 0, numOldPeople: 0, } ); } // 测试调用示例 console.log(voterResults(voters));
关键修正点说明
- 添加
return acc:确保每次迭代后把更新后的累加器传递给下一次循环,彻底解决acc变为undefined的问题。 - 调整总人数累加位置:将总人数统计移到投票判断外,保证所有用户都被计入对应年龄段的总人数。
- 函数返回统计结果:原函数没有返回值,修正后返回reduce的最终统计对象,方便直接获取结果。
内容的提问来源于stack exchange,提问作者LightSkyLiam
相关产品推荐
相关产品推荐

