You need to enable JavaScript to run this app. 如何不硬编码即可匹配ID中set-*数字实现多组预算行项求和
优惠活动
大模型
产品
解决方案
定价
更多

如何不硬编码即可匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:54:04