使用JavaScript的reduce方法筛选数值价格并计算正确总和
解决JavaScript数组reduce累加价格时跳过非数值的问题
你遇到的问题是因为'NA'是字符串类型,JavaScript的+运算符在遇到字符串时会执行字符串拼接而非数值累加,所以原本的数值会被转成字符串和'NA'拼接,最终得到245NA9530这种错误结果。
要实现跳过非数值价格、仅累加有效数值的需求,可以在reduce的回调函数中增加判断逻辑,只对有效数值进行累加:
方案一:仅判断数值类型(适合确定非数值都是字符串标记的场景)
let shoes = [ { id:205, name:'reebok', price:50 }, { id:206, name:'adidas', price:45 }, { id:207, name:'nike', price:150 }, { id:207, name:'sparx', price:'NA' }, { id:208, name:'clarks', price:95 }, { id:209, name:'bata', price:30 }, ]; const totalPrice = shoes.reduce((sum, { price }) => { // 只累加类型为number的价格,跳过非数值的'NA' return typeof price === 'number' ? sum + price : sum; }, 0); console.log(totalPrice); // 输出370
方案二:兼容可转换为数值的字符串(更通用)
如果你的数组中可能出现字符串形式的有效价格(比如price: '120'),可以用Number()转换后判断是否为有效数值,这种方式会跳过'NA'这类无法转换为数值的标记:
const totalPrice = shoes.reduce((sum, { price }) => { const convertedPrice = Number(price); // 仅当转换后是有效数值时才累加 return !isNaN(convertedPrice) ? sum + convertedPrice : sum; }, 0); console.log(totalPrice); // 输出370
关键逻辑说明
- 方案一通过
typeof price === 'number'严格判断价格的类型,只处理原本就是数值的项; - 方案二通过
Number()尝试转换价格,再用!isNaN()判断转换结果是否为有效数值,能兼容更多场景; - 两种方案都避免了字符串拼接的问题,确保累加的都是数值类型,最终得到正确的总价370。
内容的提问来源于stack exchange,提问作者cloudxchange
相关产品推荐
相关产品推荐

