仅用Reduce(callback)实现产品数组价格求和与最大值提取
实现说明
需要基于给定产品数组完成两个计算逻辑:
- 仅使用
reduce()方法计算所有有效产品价格的总和 - 提取价格字段中的最大有效数值
测试用基础数组如下:
const products = [ { product: 'banana', price: 3 }, { product: 'mango', price: 6 }, { product: 'potato', price: ' ' }, { product: 'avocado', price: 8 }, { product: 'coffee', price: 10 }, { product: 'tea', price: '' }, ]
原有代码问题排查
你之前写的求和代码运行结果异常,原因有两点:
reduce回调参数语义理解错误:第一个参数是遍历过程中的累计值,第二个参数是当前遍历到的完整产品对象,不是单独的价格字段,直接将累计值和对象相加会触发隐式类型转换,输出非预期结果- 未做无效价格过滤:数组中存在空格字符串、空字符串格式的无效价格,直接参与计算会导致结果错乱
可运行实现代码
1. 仅用reduce计算有效价格总和
const sum = products.reduce((total, currentProduct) => { // 统一处理价格值:转字符串、去首尾空白、转数字 const price = Number(currentProduct.price.toString().trim()) // 仅有效数字参与累加,无效值按0计算 return total + (isNaN(price) ? 0 : price) }, 0) console.log(sum) // 输出:27
2. 提取最大有效价格
同样可以通过reduce一次遍历完成计算,不需要额外使用filter/forEach:
const maxPrice = products.reduce((currentMax, currentProduct) => { const price = Number(currentProduct.price.toString().trim()) // 无效价格直接返回当前已记录的最大值 if (isNaN(price)) return currentMax // 当前价格更大则更新最大值,否则保留原有值 return price > currentMax ? price : currentMax }, 0) console.log(maxPrice) // 输出:10
注意事项
- 使用
reduce时建议始终传入初始值(即方法的第二个参数),避免空数组遍历报错,同时保证累计值类型符合预期 - 处理混合类型的数值字段时,必须先做类型转换和有效性校验,过滤掉空值、空白字符串、非数字值,避免隐式类型转换导致的计算错误
内容的提问来源于stack exchange,提问作者ashrth
相关产品推荐
相关产品推荐

