JavaScript如何正确使用reduce统计对象内布尔值数量
JS嵌套对象布尔值总数统计(reduce实现)
为什么代码会返回undefined
reduce是数组原型上的专属方法,直接在普通对象上调用会直接报错;如果代码能运行但返回undefined,基本是两个问题:
- 没有给
reduce传入累加器的初始值 - 遍历回调函数中没有返回更新后的累加值,导致下一轮遍历拿不到累计结果
正确实现代码
首先用Object.values()把外层对象的属性值提取为数组(也就是三个宠物的子对象组成的数组),再调用reduce做累加,每轮遍历统计当前子对象里布尔类型值的数量,加到总计数上即可。
const petMap = { mongoose: { name: "Starky", age: 3, playful: false }, dog: { name: "Maks", age: 7, playful: false }, parrot: { name: "Petty", age: 4, playful: true } } // 统计布尔值总数 const booleanTotal = Object.values(petMap).reduce((count, currentItem) => { // 统计当前子对象里布尔类型值的个数 const currentBoolNum = Object.values(currentItem).filter(value => typeof value === 'boolean').length // 返回累加后的计数,这步不能漏 return count + currentBoolNum }, 0) // 0是累加初始值,必须传 console.log(booleanTotal) // 运行输出3,和示例对象的布尔值数量匹配
关键注意点
- 普通对象要先用
Object.values()/Object.entries()转成数组后,才能调用数组的reduce方法 reduce的第二个参数是累加器初始值,做数值统计时固定传0即可,不传会默认拿数组第一个元素当初始值,统计逻辑会完全错乱- 每轮遍历的回调必须return更新后的累加值,否则累加器会变成
undefined,最终结果也会是undefined
内容的提问来源于stack exchange,提问作者user19294310
相关产品推荐
相关产品推荐

