
本文详解如何正确遍历 javascript 中的嵌套对象,提取并累加深层属性(如 `numberofdrinks`)的数值,避免常见索引错误,最终得到准确的总数。
在处理类似 { 'Cheryl': { numberOfDrinks: 10 }, ... } 这样的键值对结构时,一个典型误区是误将 Object.values() 返回的对象(如 { numberOfDrinks: 10 })当作键名使用,进而尝试用它去反查原对象(如 drunks[drink]),这会导致 undefined,最终累加结果为 NaN 或 0。
正确的做法是:直接访问每个子对象上的目标属性。由于 Object.values(drunks) 返回的是一个由嵌套对象组成的数组(即 [{ numberOfDrinks: 10 }, { numberOfDrinks: 4 }, ...]),我们可在 forEach 回调中直接解构或点访问该属性:
const drunks = {
'Cheryl': { numberOfDrinks: 10 },
'Jeremy': { numberOfDrinks: 4 },
'Gordon': { numberOfDrinks: 2 },
'Laura': { numberOfDrinks: 6 }
};
let totalDrunks = 0;
const numberOfDrunks = Object.values(drunks);
numberOfDrunks.forEach(drink => {
totalDrunks += drink.numberOfDrinks; // ✅ 正确:从当前子对象取值
});
console.log(totalDrunks); // 输出:22更简洁、函数式的方式推荐使用 reduce:
const totalDrunks = Object.values(drunks) .reduce((sum, person) => sum + person.numberOfDrinks, 0); console.log(totalDrunks); // 22
✅ 关键要点总结:
- Object.values(obj) 返回值数组,不是键名数组;
- 不要写 obj[value](value 是对象,非字符串键);
- 应直接访问 value.targetProperty;
- 若存在属性缺失风险(如某些人无 numberOfDrinks),建议增加防御性检查:
sum + (person.numberOfDrinks ?? 0)
掌握这一模式,可轻松扩展至任意深度嵌套对象的数值聚合场景。










