如何不硬编码即可匹配ID中set-*数字实现多组预算行项求和
问题原因说明
你当前优化版本的代码始终返回0,核心问题是选择器匹配逻辑有误:你用ID的前缀规则id_newbudgetlineitem_set-${i}去匹配name属性,但绝大多数第三方自动生成的表单中,name属性的格式和ID属性并不一致,导致选择器没有命中任何需要统计的输入元素,累加逻辑没有执行,total始终为初始值0。
解决方案
不需要硬编码任何set编号,通过正则从元素ID中动态提取set编号分组统计即可,无论有多少个set、编号是否连续都可以正常适配:
function update_total_total_total() { // 用对象存储每个set的总和,key为set编号,value为对应总和 const setTotals = {} // 匹配所有set相关的输入,排除不需要统计的字段 $('input[id*="id_newbudgetlineitem_set-"]:not([id$="line_item_total"]):not([id$="line_item_cost_center"]):not([id$="line_item_description"])').each(function() { // 从当前元素ID中提取set编号 const setMatch = this.id.match(/set-(\d+)-/) if (!setMatch) return const setNum = setMatch[1] // 初始化对应set的总和 if (!setTotals[setNum]) setTotals[setNum] = 0 // 累加有效值 const val = parseFloat($(this).val()) !isNaN(val) && (setTotals[setNum] += val) }) // 将计算好的总和写入对应set的总额输入框 Object.entries(setTotals).forEach(([setNum, total]) => { $(`input[id$="set-${setNum}-line_item_total"]`).val(total) }) }
方案优势
- 无需提前知道set的数量、编号范围,1000个set也不需要写重复逻辑
- 支持非连续的set编号,不会出现漏算情况
- 仅需维护一次排除规则,后续新增字段不需要修改大量代码
内容的提问来源于stack exchange,提问作者Steve Smith
相关产品推荐
相关产品推荐

