如何访问对象所有属性并求和,实现orderSupplies函数的正确计算?
解决orderSupplies函数的实现问题
需求说明
实现orderSupplies函数,它接收两个参数:
supplies对象:键为派对用品名称,值为该用品的单件成本guests数值:参会宾客的人数
函数需返回为每位宾客订购一件各类用品的总成本。
代码示例
orderSupplies({ cake: 2, iceCream: 7 }, 2); // 预期返回 18 (计算逻辑:(2+7)*2 = 18) orderSupplies({ plates: 2, cups: 1, forks: 1, partyHats: 4 }, 20); // 预期返回 160 (计算逻辑:(2+1+1+4)*20 = 160)
原代码的问题
当前给出的实现有两个核心错误:
- 对象没有
length属性,用数组式的for循环遍历完全无效 - 循环中直接累加
supplies对象本身,而不是对象里的属性值
正确实现方法
方法1:用for...in遍历对象属性
function orderSupplies(supplies, guests) { let totalPerPerson = 0; // 遍历supplies的所有属性 for (const item in supplies) { totalPerPerson += supplies[item]; } // 单人总成本乘以宾客数得到最终费用 return totalPerPerson * guests; }
方法2:用Object.values()+reduce快速求和
function orderSupplies(supplies, guests) { // 获取所有用品成本的数组,再用reduce累加求和 const totalPerPerson = Object.values(supplies).reduce((sum, cost) => sum + cost, 0); return totalPerPerson * guests; }
方法3:用Object.entries()遍历键值对
function orderSupplies(supplies, guests) { let totalPerPerson = 0; // 遍历每个[用品名称, 成本]的键值对 for (const [_, cost] of Object.entries(supplies)) { totalPerPerson += cost; } return totalPerPerson * guests; }
关键知识点
- 对象无法像数组那样通过索引和
length遍历,必须使用对象专用的遍历方法 Object.values()会直接返回对象所有属性值组成的数组,是快速求和的简洁方案- 如果需要避免遍历到原型链上的属性,
for...in可以配合supplies.hasOwnProperty(item)判断(普通业务场景下的supplies对象一般不需要)
内容的提问来源于stack exchange,提问作者wizkid23
相关产品推荐
相关产品推荐

