You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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);

代码说明

  1. 合并遍历: 直接在reduce中完成字段提取与累加,避免额外的map遍历,提升执行效率。
  2. 类型安全: 定义ArticleTotal类型替代any,让TypeScript能提前发现类型错误。
  3. 正确初始化: 使用(acc[articleId] || 0)确保首次遇到ID时初始值为0(数值类型),彻底解决字符串拼接问题。
  4. 可读性提升: 用Math.abs明确表达“取绝对值”的业务意图,比双重负号更易理解。

内容的提问来源于stack exchange,提问作者ivory uchiwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:47:55