Object.reduce返回结果异常,求和valorReal值错误排查求助
问题分析与修复方案
核心错误点
你的代码有三个关键问题导致求和结果异常:
- 累加逻辑完全错误:计算
valorReal时,你用的是a.demonstrativoIr.demonstrativo[0].valorReal(始终是第一个元素的原始数值)加上当前b的对应值,而不是用之前已经累加好的a.valorReal来持续累积总和。这导致每次循环都在重复计算第一个元素的值+当前元素的值,而非逐步累加所有元素的总和。 - 仅累加了每个
demonstrativo数组的第一项:如果你的需求是求和每个demonstrativo数组中所有valorReal值,当前代码只取了[0]索引的项,会漏掉其他项的数值。 - 未设置
reduce初始值:虽然这不是直接导致结果错误的原因,但空数组会引发报错,且初始值缺失会让reduce行为不够清晰可控。
修复后的代码(按需选择)
场景1:求和所有demonstrativo数组里的所有valorReal
如果需要把每个data元素的demonstrativoIr.demonstrativo数组中所有valorReal都累加:
.subscribe((data: any[]) => { // 计算所有valorReal的总和:先遍历每个data元素,再遍历其demonstrativo数组 const totalValorReal = data.reduce((total, item) => { // 处理可能的空值/undefined,避免报错 const itemSum = item.demonstrativoIr?.demonstrativo?.reduce((sum, demo) => sum + (demo.valorReal || 0), 0) || 0; return total + itemSum; }, 0); // 必须设置初始值0 // 同步计算valor的总和 const totalValor = data.reduce((sum, item) => sum + (item.valor || 0), 0); // 构造最终的movimento对象 this.movimento = { dataMovimento: data[0]?.dataMovimento, // 取第一个元素的日期,按需调整 valor: totalValor, valorReal: totalValorReal }; });
场景2:仅求和每个demonstrativo数组的第一个valorReal
如果你的需求确实只需要每个data元素的demonstrativo[0].valorReal,只需修复累加逻辑并添加初始值:
.subscribe((data: any[]) => { this.movimento = data.reduce((acc, curr) => ({ ...acc, dataMovimento: acc.dataMovimento || curr.dataMovimento, // 初始时取第一个元素的日期 valor: acc.valor + (curr.valor || 0), // 用之前累加好的acc.valorReal,而非原始的demonstrativoIr值 valorReal: acc.valorReal + (curr.demonstrativoIr?.demonstrativo[0]?.valorReal || 0) }), { // 设置初始值,避免acc无属性导致的错误 dataMovimento: null, valor: 0, valorReal: 0 }); });
为什么你得到了416?
大概率是你的第一个data元素的demonstrativoIr.demonstrativo[0].valorReal值为416,而后面24个元素的对应值都是0。由于你的累加逻辑每次都取第一个元素的原始值,后续循环始终是416 + 0,最终结果就停在了416。
内容的提问来源于stack exchange,提问作者Daniel Bezerra De Menezes
相关产品推荐
相关产品推荐

