如何在JavaScript的reduce中针对数组内特定对象做统计计算?
实现数组对象的筛选式累加(类似SQL WHERE)
没问题!要给你的累加逻辑加上类似SQL WHERE的筛选条件,其实很简单,这里有两种实用的方案,你可以根据场景选择:
方案1:先过滤再累加(可读性优先)
先通过filter()把符合条件的对象挑出来,再进行后续的计算,逻辑清晰易懂,适合大多数场景:
// 替换这里的筛选条件为你的实际需求,比如 item.isSelected === true 或者 item.type === 'food' const filterCondition = item => item.isSelected; newcost = Number((cart .filter(filterCondition) .map(item => item.cost * item.amm) .reduce((prev, next) => Number(prev) + Number(next), 0) // 加上初始值0,避免空数组报错 ).toFixed(2));
说明:filter()会遍历数组,只保留满足条件的对象,剩下的才进入map和reduce流程,完美实现你要的“WHERE”筛选效果。
方案2:在reduce内部直接筛选(性能优先)
如果你的数组数据量很大,不想多一次遍历,可以直接在reduce里判断条件,只累加符合要求的项:
newcost = Number((cart.reduce((total, item) => { // 这里写入你的筛选条件 if (item.isSelected) { return total + item.cost * item.amm; } // 不满足条件时返回原累加值 return total; }, 0)).toFixed(2));
说明:这种方法只需要遍历数组一次,比方案1少了filter和map的两次遍历,性能更优,代码也很紧凑。
额外提醒
- 一定要给
reduce加上初始值0,不然如果数组为空或者没有符合条件的项,会返回undefined,导致后续计算出错; toFixed(2)会返回字符串类型的数值,所以最后用Number()转成数字类型,避免后续操作出现类型问题。
你只需要把代码里的筛选条件替换成你实际需要的判断逻辑(比如筛选特定分类、已勾选的商品等等)就可以啦!
内容的提问来源于stack exchange,提问作者Steven Dropper
相关产品推荐
相关产品推荐

