繁体   English   中英

使用Jinja2过滤器中的条件从字典列表中过滤数据

[英]Filter data from list of dicts using condition in Jinja2 filter

data:
  - { name: foo, app: foo, isweb: true }
  - { name: bar, app: bar, isweb: true }
  - { name: foobar, app: foobar, isweb: false }
  - { name: baz, app: baz, isweb: false }

所需结果为:

{% set  list= [] %}
{% for item in data %}
{% if item.isweb == true %}
{{list.append(item.app)}}
{% endif %}
{% endfor %}

是否可以使用过滤器来实现:

{{ data | map(attribute='app') | list | join(' ') }}

基本上,问题是如何使用单行过滤器(如上所述)实现上述for循环,但仅获取具有isweb true值的数据。

有几种方法可以做到这一点(使用ansible 2.7。不确定较低的版本):

纯过滤器方式(使用selectattrmap ):

- set_fact: app_list="{{ data | selectattr("isweb", "equalto", true) | map(attribute='app') | list }}"

在过滤器中对条件使用ansible loop

- set_fact: app_list="{{ (app_list | default([])) + ([ item.app ] if (item.isweb == True) else []) }}"
  loop: "{{ data }}"

when语句中使用Ansible loop

- set_fact: app_list="{{ (app_list | default([])) + [ item.app ] }}"
  loop: "{{ data }}"
  when: item.app is defined and item.app == true

您即将解决它,只需添加另一个过滤器:

{{ data | selectattr('isweb', 'equalto', true) | map(attribute='app') | list | join(' ') }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM