本文讲解如何正确遍历 javascript 中的嵌套对象,提取每一项中特定键(如 `numberofdrinks`)的数值,并高效计算其总和,避免常见索引错误。
在处理类似 { ‘Alice’: { count: 5 }, ‘Bob’: { count: 3 } } 这样的键值对结构时,一个典型误区是混淆了 Object.values() 返回的值对象数组与原始对象的键名关系。例如,原代码中:
const drunks = {
'Cheryl': { numberOfDrinks: 10 },
'Jeremy': { numberOfDrinks: 4 },
'Gordon': { numberOfDrinks: 2 },
'Laura': { numberOfDrinks: 6 }
};
let totalDrunks = 0;
let numberOfDrunks = Object.values(drunks); // → [{numberOfDrinks:10}, {numberOfDrinks:4}, ...]
numberOfDrunks.forEach((drink) => {
totalDrunks += drunks[drink]; // ❌ 错误!drink 是对象,不能作为 drunks 的 key
});
此处 drink 是一个对象(如 { numberOfDrinks: 10 }),而 drunks[drink] 实际上等价于 drunks[Object.prototype.toString.call(drink)],结果为 undefined,导致累加失败(最终 totalDrunks 为 NaN)。
✅ 正确做法是:直接访问当前值对象上的目标属性:
numberOfDrunks.forEach((drink) => {
totalDrunks += drink.numberOfDrinks; // ✅ 正确:从每个 value 对象中取属性
});
console.log(totalDrunks); // 22
更简洁、函数式风格的写法推荐使用 reduce: