使用JavaScript的filter和reduce高阶函数计算Bob的购买总价问题求助
解决思路与修正代码
嘿,我来帮你搞定这个问题!咱们先拆解下你代码里的核心问题,再给出完整的修正方案:
1. filter 方法的条件错误
你当前的filter回调写了total=>total=purchases.owner="Bob",这里全是赋值操作,不是判断逻辑——不仅会把所有元素都保留下来(赋值表达式结果是"Bob",转为布尔值为true),还错误地访问了整个数组的owner属性(purchases.owner)。正确的应该是检查每个数组元素的owner是否等于"Bob"。
2. reduce 方法的参数错误
reduce的第二个参数是当前遍历到的元素,你需要从中取出price属性来累加,而不是直接加元素本身;另外最好给reduce一个初始值0,避免当过滤结果为空时出现NaN。
修正后的完整代码
const purchases = [{"owner":"Barry","price":103},{"owner":"Bob","price":75}, {"owner":"Bob","price":73},{"owner":"Barry","price":57},{"owner":"Barry","price":128}, {"owner":"Bob","price":119},{"owner":"Barry","price":133},{"owner":"Barry","price":27}, {"owner":"Barry","price":138},{"owner":"Bob","price":68},{"owner":"Bob","price":50}, {"owner":"Barry","price":9},{"owner":"Bob","price":123},{"owner":"Bob","price":135}, {"owner":"Barry","price":30},{"owner":"Barry","price":129},{"owner":"Barry","price":38}, {"owner":"Bob","price":133},{"owner":"Barry","price":109},{"owner":"Bob","price":115}] // 先过滤出Bob的所有购买记录,再累加价格 let bobsTotal = purchases .filter(item => item.owner === "Bob") .reduce((total, item) => total + item.price, 0); // 初始值0很重要 console.log(bobsTotal); // 输出结果:796
代码解释
filter(item => item.owner === "Bob"):遍历数组,只保留owner为"Bob"的元素,得到Bob的所有购买记录数组。reduce((total, item) => total + item.price, 0):从初始值0开始,把每个元素的price累加到total上,最终得到总价。
更高效的替代实现
如果你想减少一次数组遍历,也可以用reduce单独完成逻辑(只遍历一次数组):
let bobsTotal = purchases.reduce((total, item) => { return item.owner === "Bob" ? total + item.price : total; }, 0);
这个方法的逻辑是:遍历每个元素,如果是Bob的购买记录,就把价格加到总和里,否则直接返回当前总和,同样初始值设为0。
内容的提问来源于stack exchange,提问作者Justin Valdez
相关产品推荐
相关产品推荐

