4

假设我有一个对象或字典数组,我想计算数组中具有特定值的属性的对象数。

Jinja 已经提供了一种迭代具有特定值的元素的机制:

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list if e.a == 1 %}
   ...
{% endfor %}

我只是想知道 for 循环将被评估多少次。

我能想到的最好的方法是loop.last在上述循环的最后一次迭代中使用变量来评估我的表达式

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list if e.a == 1 %}
  {% if loop.last %}
    list contains {{ loop.index }} elements with a=1
  {% endif %}
{% endfor %}

但是,如果匹配项的数量为零,这将不起作用。我显然可以将条件放入循环中以解决该问题

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list %}
  {% if e.a == 1 %}
    {% set count = count|d(0) + 1 %}
  {% endif %}
  {% if loop.last %}
    list contains {{ count }} elements with a=1
  {% endif %}
{% endfor %}

只要列表不为空(在我的情况下,列表永远不会为空),现在就可以了。

另一个明显的答案是向全局上下文添加一个可用于执行此计算的函数,但我很惊讶这样的功能还不存在。

我的目标是在表格中存在特定值时更改某些表格标题的样式。

4

2 回答 2

7

您可以使用 jinja 的功能以简洁的方式实现您的目标,而无需使用循环:

{{ yourlist | selectattr("a", "equalto", 1) | list | count }}

请注意,您必须使用列表过滤器才能计数。

于 2018-12-07T14:22:16.360 回答
0

还有loop.length,你有没有看过使用它?

于 2013-03-18T11:27:09.953 回答