From 6b0ca7a207f305006ab90fe0c76b0fc3e37a8005 Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 13 May 2025 10:56:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(currentSteamCurve):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E8=83=BD=E6=B5=81=E9=80=9F=E6=9B=B2=E7=BA=BF=E5=B9=B3?= =?UTF-8?q?=E5=9D=87=E5=80=BC=E8=AE=A1=E7=AE=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在计算平均值时增加了对无效值(NaN)的过滤 - 确保只有有效的数值参与平均值计算,提高数据准确性 -目前的计算逻辑是: 通过 processedData.filter(item => !item.isBreakPoint) 过滤掉标记为“停电”期间插入的断点 (isBreakPoint: true)。 使用 validData.map(e => parseFloat(e[valueField])) 将需要计算的字段值转换为浮点数。 使用 reduce 计算总和并除以数量得到平均值。 问题可能出在第二步或第三步: parseFloat(e[valueField]) 的结果: 如果 e[valueField] 的原始值是 null, undefined, 空字符串 "" 或其他非数字格式,parseFloat 会返回 NaN (Not a Number)。 reduce((a, b) => a + b, 0) 的行为: 当数组中包含 NaN 时,reduce 的累加结果也会变成 NaN。 后续计算: NaN / validValues.length 的结果是 NaN。最后对 NaN 调用 .toFixed(2) 的结果在不同 JavaScript 环境下可能不一致,但通常是字符串 "NaN",而不是负数。 然而,既然显示了负数,可能存在更隐藏的问题,或者是在 reduce 过程中,某些非数字值(如 null)被隐式转换为了 0,但某些其他值导致了异常。最稳妥的方法是在计算平均值之前,显式地过滤掉所有非数字(NaN)的值。 我将修改 processDataBreaks 函数,在计算平均值之前增加一步,过滤掉 map 操作后可能产生的 NaN 值。 --- src/views/ems/report/currentSteamCurve/index.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/views/ems/report/currentSteamCurve/index.vue b/src/views/ems/report/currentSteamCurve/index.vue index ecb828b..e4966fb 100644 --- a/src/views/ems/report/currentSteamCurve/index.vue +++ b/src/views/ems/report/currentSteamCurve/index.vue @@ -565,11 +565,13 @@ export default { const timeData = processedData.map(e => e.recordTime) const valueData = processedData.map(e => e[valueField]) - // 计算平均值时排除中断点 + // 计算平均值时排除中断点和无效值 const validData = processedData.filter(item => !item.isBreakPoint) const validValues = validData.map(e => parseFloat(e[valueField])) - const average = validValues.length > 0 ? - (validValues.reduce((a, b) => a + b, 0) / validValues.length).toFixed(2) : 0 + // 进一步过滤掉 NaN 值 + const validNumericValues = validValues.filter(v => !isNaN(v)); + const average = validNumericValues.length > 0 ? + (validNumericValues.reduce((a, b) => a + b, 0) / validNumericValues.length).toFixed(2) : 0 return { processedData,