calcTotal函数未选全type时控制台输出NaN 如何正常计算总值
类型选择组件联动calcTotal计算NaN问题修复方案
问题核心原因
出现NaN的根源完全来自条件分支的赋值逻辑:
- 原代码中与类型选择绑定的三个变量
this.supInton、this.supEv、this.supIv没有统一初始化规则,仅当匹配对应type值时才会给其中一个变量赋值 - 未匹配分支对应的两个变量会保持undefined状态、甚至残留上一次计算的旧值,将这类非数值属性和其他正常计算值做加法时,最终结果就会返回NaN
- 计算总值时不需要等另外两个类型的计算值,只需要对这些非当前选中类型的项补0,就可以不打断计算流程得到有效结果
可直接落地的代码调整
改动遵循最小侵入原则,不改变原有业务的权重计算规则,核心调整点有两个:
- 每次循环计算单个变体的总值前,将三个类型关联的变量统一初始化为0
- 将原有的实例级共享属性改为循环内的局部变量,避免跨循环、跨类型选择的旧值污染
调整后的完整代码如下:
type: number = 0 calcTotal() { this.variabileIntervento.forEach(t => { t.totale = [] for (const i in t.varianti) { // 不受type影响的固定计算项 this.modCos = t.modicitaDiCosto[i] * this.ponderazione[0] this.effic = t.efficacia[i] * this.ponderazione[1] this.revers = t.reversibilita[i] * this.ponderazione[3] this.semplCant = t.semplicitaDiCantiere[i] * this.ponderazione[4] this.esigIngom = t.esiguitaDiIngombro[i] * this.ponderazione[5] // 类型关联计算项:先统一初始化为0,按当前type匹配赋值 let supInton = 0 let supEv = 0 let supIv = 0 if(this.type == 1) { supInton = t.supIntonacate[i] * this.ponderazione[2] } else if(this.type == 2) { supEv = t.supEvIi[i] * this.ponderazione[2] } else if(this.type == 3) { supIv = t.supIvEi[i] * this.ponderazione[2] } // 代入所有有效值计算总值,不存在undefined即可杜绝NaN const currentVariantTotal = this.modCos + this.effic + supInton + supEv + supIv + this.revers + this.semplCant + this.esigIngom t.totale.push(currentVariantTotal) } console.log("Total: ", t.totale); }) }
调整后的效果
- 无论选中type=1/2/3中的哪一个,未匹配的两个类型关联项都按0计入总值,不会出现undefined导致的NaN
- 局部变量的作用域限制,彻底解决了之前实例属性残留旧值的问题,切换下拉选项时不需要额外手动重置全局状态
- 完全兼容原有业务规则:选中哪个类型,就只把对应类型的面积项乘以权重计入总值,其他项不额外增加计算成本
内容的提问来源于stack exchange,提问作者Daniele Vallorani
相关产品推荐
相关产品推荐

