如何在对象数组的map操作中嵌入非负数校验并计算非负数总和?
问题解答
不需要额外执行map操作,甚至连你当前的map步骤都可以优化掉,直接一步算出非负数的总和。
几种可行的实现方式:
- 如果非要在现有map里嵌入负数校验(比如把负数转成0,不影响求和结果):
const items = [{ price: 250 }, { price: -150 }, { price: 150 }, { price: 500 }]; // 在map里直接判断,负数转0 let priceList = items.map(({ price }) => price >= 0 ? price : 0); // 计算总和 const total = priceList.reduce((sum, num) => sum + num, 0); console.log(total); // 输出900
- 更高效的方式:跳过单独的map,一次遍历完成计算:
因为你的最终目的是求和,没必要先把price提取成数组再处理,直接用reduce结合判断,或者filter+reduce都可以:// 方式1:先过滤掉负数,再求和 const total = items.filter(({ price }) => price >= 0) .reduce((sum, { price }) => sum + price, 0); // 方式2:直接在reduce里判断,一次遍历搞定(性能最优) const total = items.reduce((sum, { price }) => { return price >= 0 ? sum + price : sum; }, 0);
简单来说,map只是做元素转换,你完全可以在map的回调里加入负数判断逻辑,但从性能和简洁性考虑,直接用reduce一步处理是更好的选择。
内容的提问来源于stack exchange,提问作者spectre_it
相关产品推荐
相关产品推荐

