JavaScript使用reduce统计各作者博客数量未得到预期结果怎么办
reduce写法错误原因分析
核心错误是你违反了Array.reduce的使用规则:回调函数每轮执行完成后必须返回当前的累加器acc,才能保证下一轮迭代可以正常拿到累加的对象。
你的原写法回调里只有三目运算表达式:
acc[curr.author] ? acc[curr.author]+=1 : acc[curr.author]=1
这个表达式的本质是赋值操作,赋值语句的返回值是等号右侧的计算结果(数字类型):
- 第一轮迭代时,初始
acc是空对象,给Michael Chan对应的属性赋值为1,此时表达式返回值是1 - 第二轮迭代开始,
acc被替换为上一轮返回的数字1,尝试访问1[curr.author]本身就是无效操作,后续所有迭代都无法正常累加 - 最终整个reduce方法的返回值就是最后一轮迭代赋值的结果
1
正确写法
可以给回调加函数体,显式返回acc:
const countResult = blogs.reduce((acc,curr)=> { acc[curr.author] = acc[curr.author] ? acc[curr.author] + 1 : 1 return acc }, {})
也可以用逗号运算符简化为一行写法:
const countResult = blogs.reduce((acc,curr)=> (acc[curr.author] = (acc[curr.author] || 0) + 1, acc), {})
内容的提问来源于stack exchange,提问作者Burton
相关产品推荐
相关产品推荐

