You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jinja2中按name属性过滤求和details.sections.details的value值?

Jinja2按name过滤sections并求和的正确实现

正确写法(推荐)

结合Jinja2过滤器链式调用,先筛选目标section,再对details的value字段求和:

{# 计算Earnings总和 #}
{% set earnings_total = details.sections|selectattr('name', 'equalto', 'Earnings')|map(attribute='details')|first|sum(attribute='value') %}

{# 计算Deductions总和 #}
{% set deductions_total = details.sections|selectattr('name', 'equalto', 'Deductions')|map(attribute='details')|first|sum(attribute='value') %}

{# 输出结果 #}
Earnings: {{ earnings_total }}
Deductions: {{ deductions_total }}

步骤说明:

  • selectattr('name', 'equalto', 'Earnings'):从sections数组中筛选出name为Earnings的section对象
  • map(attribute='details'):提取该section下的details数组
  • first:取出筛选后迭代器中的唯一元素(即目标details数组)
  • sum(attribute='value'):对details数组内所有元素的value字段求和

你之前写法的错误原因

  1. 第一种写法未做过滤,直接调用details.sections.details无效——sections是数组,不能直接通过.访问子元素的details,必须先筛选出目标section,因此脚本加载失败。
  2. 第二种写法错误在于Jinja2默认不支持直接重新赋值已声明的变量,sumAdditions = sumAdditions + details.value这种语法不符合Jinja2规则,导致执行报错。

兼容旧版Jinja2的手动累加写法

如果你的Jinja2版本较低(不支持selectattr或变量重新赋值),可以用命名空间实现可变变量,循环累加:

{# 计算Earnings总和 #}
{% set ns = namespace(earnings_total=0) %}
{% for section in details.sections %}
  {% if section.name == 'Earnings' %}
    {% for item in section.details %}
      {% set ns.earnings_total = ns.earnings_total + item.value %}
    {% endfor %}
  {% endif %}
{% endfor %}

{# 计算Deductions总和 #}
{% set ns_deduct = namespace(deductions_total=0) %}
{% for section in details.sections %}
  {% if section.name == 'Deductions' %}
    {% for item in section.details %}
      {% set ns_deduct.deductions_total = ns_deduct.deductions_total + item.value %}
    {% endfor %}
  {% endif %}
{% endfor %}

{# 输出结果 #}
Earnings: {{ ns.earnings_total }}
Deductions: {{ ns_deduct.deductions_total }}

内容的提问来源于stack exchange,提问作者Bisoux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:15:34