为何JavaScript的reduce方法无法统计对象数组中的燃料类型总数?
问题分析与解决:统计fuelType数量结果全为0的原因
你的代码存在两个关键问题,导致统计结果全部为0:
1. 首次计数初始化逻辑错误
在reduce的回调函数中,当遇到新的fuelType时,你将其计数初始化为0,但当前元素本身就是该类型的第一个实例,正确的初始值应该是1。原代码的错误逻辑:
else acc[fuel] = 0;
这会导致每种fuelType第一次出现时计数被设为0,后续即使有相同类型,累加也会从0开始,最终所有统计值都少算一个实例,甚至单个实例的类型会直接显示为0。
2. 对象属性名大小写不匹配
数组中第三个飞船对象的燃料类型属性名是FuelType(首字母大写F),但代码中始终使用cur.fuelType(小写f)获取值,这会导致该对象的cur.fuelType返回undefined,最终统计结果里会多出一个undefined的键,值同样为0。
修正后的代码
let spaceships = [{ homePlanet: 'Earth', color: 'silver', fuelType: 'Turbo Fuel', numCrew: 5, flightPath: ['Venus', 'Mars', 'Saturn'] }, { homePlanet: 'Venus', color: 'space gray', fuelType: 'Rocket Fuel', numCrew: 4, flightPath: ['Venus', 'Pluto', 'Saturn'] }, { homePlanet: 'Neptune', color: 'gold', fuelType: 'Diesel', // 统一属性名为小写fuelType numCrew: 7, flightPath: ['Mercury', 'Mars', 'Jupiter'] }, { homePlanet: 'Earth', color: 'silver', fuelType: 'Gasoline', numCrew: 2, flightPath: ['Saturn', 'Mars', 'Venus'] }, { homePlanet: 'Earth', color: 'silver', fuelType: 'Rocket Fuel', numCrew: 8, flightPath: ['Saturn', 'Saturn', 'Jupiter'] }, { homePlanet: 'Jupiter', color: 'space gray', fuelType: 'Turbo Fuel', numCrew: 3, flightPath: ['Jupiter', 'Mercury', 'Venus'] }, ]; const totalFuelType = spaceships.reduce(function(acc, cur) { const fuel = cur.fuelType; if (acc[fuel]) { acc[fuel]++; } else { acc[fuel] = 1; // 首次出现时初始化为1 } return acc; }, {}); console.log(totalFuelType);
运行结果
修正后控制台会输出正确的统计结果:
{ "Turbo Fuel": 2, "Rocket Fuel": 2, "Diesel": 1, "Gasoline": 1 }
如果不想修改原数组的属性名,也可以在获取燃料类型时兼容大小写,比如用const fuel = cur.fuelType || cur.FuelType;,但更推荐统一属性名的大小写,避免后续出现类似问题。
内容的提问来源于stack exchange,提问作者Jack Averill
相关产品推荐
相关产品推荐

