如何使用Reduce()方法获取产品ID及对应金额?
代码正确性验证与优化方案
原代码存在的问题
- 类型错误导致计算异常: 首次遇到某个
article_id时,你将acc[curr.article_id]初始化为空字符串'',后续执行+=操作会触发字符串拼接而非数值相加。比如同ID的两条目montant分别为10和20时,最终结果会是"1020"而非预期的30。 - 冗余的
map操作: 先通过map提取字段再执行reduce,多了一次数组遍历,在数据量较大时会影响性能。 - 类型注解不严谨:
acc: any丢失了TypeScript的类型检查优势,容易埋下隐性bug。 - 冗余的数值转换:
-(-curr.montant)等价于直接使用curr.montant,若需强制金额为正,更清晰的写法是Math.abs(curr.montant)。
修正后的优化代码
基础优化版(合并遍历+类型安全)
// 定义结果类型,增强类型检查 type ArticleTotal = { [articleId: string | number]: number; }; const finalArray = apiArray.reduce((acc: ArticleTotal, curr) => { const articleId = curr.article_id; // 确保初始值为数值类型0,避免字符串拼接 acc[articleId] = (acc[articleId] || 0) + curr.montant; return acc; }, {} as ArticleTotal); console.log('finalArray==', finalArray);
需强制金额为正的场景版
如果需要处理可能为负的montant(比如退款金额),可以用Math.abs明确转换:
const finalArray = apiArray.reduce((acc: ArticleTotal, curr) => { const articleId = curr.article_id; acc[articleId] = (acc[articleId] || 0) + Math.abs(curr.montant); return acc; }, {} as ArticleTotal);
代码说明
- 合并遍历: 直接在
reduce中完成字段提取与累加,避免额外的map遍历,提升执行效率。 - 类型安全: 定义
ArticleTotal类型替代any,让TypeScript能提前发现类型错误。 - 正确初始化: 使用
(acc[articleId] || 0)确保首次遇到ID时初始值为0(数值类型),彻底解决字符串拼接问题。 - 可读性提升: 用
Math.abs明确表达“取绝对值”的业务意图,比双重负号更易理解。
内容的提问来源于stack exchange,提问作者ivory uchiwa
相关产品推荐
相关产品推荐

