4

オブジェクトまたはdictの配列があるとすると、特定の値を持つ属性を持つ配列内のオブジェクトの数を数えたいと思います。

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 %}

リストが空でない限り、これで問題ありません(私の場合、リストが空になることはありません)。

もう1つの明白な答えは、この計算を実行するために使用できる関数をグローバルコンテキストに追加することですが、そのような関数がまだ存在していないことに驚いています。

私の目標は、特定の値がテーブルに存在する場合に、特定のテーブルヘッダーのスタイルを変更することです。

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 に答える