如何根据 Ansible Jinja2 中的公共键值组合 2 个列表

How to combine 2 list based on a common key value in Ansible Jinja2

我正在尝试根据 JSON 数组中的公共键 (organizationId) 值将特定值组合到列表中。在这里,我使用 Jinja 模板创建一个 Json 文件,该文件将用于进一步处理。所以这里 sample.json 是 JSON 文件,test.j2(Jinja 模板)将从中获取值做一个最终的JSON(下面提到的预期输出)

Sample.json

[
    {
       
        "id": "111222333444627213",
        "organizationId": "111222333444624074"
        
    },
    {
        
        "id": "111222333444627214",
        "organizationId": "111222333444624074"
    },
    {
        
        "id": "111222333444627216",
        "organizationId": "111222333444624074"
    },
    {
        "id": "111222333444627217",
        "organizationId": "12345678"
    }
]

test.j2(神社)

[
  {% for dict_item in sample.json %}
{
   "orgid":"{{dict_item['organizationId']}}",
   "objectIds":[ 
       "{{ dict_item['id']}}"
   ]
}{% if not loop.last %},
  {% endif %}
  {% endfor %}
]

预期输出

[
  {
   "orgid":"111222333444624074",
   "objectIds":[ 
       "111222333444627213",
       "111222333444627214",
       "111222333444627216",
   ]
},
    {
   "orgid":"12345678",
   "objectIds":[ 
       "111222333444627217" 
   ]
} 
 ]

不需要 Jinja2。相反,迭代过滤器 groupby 创建的列表。例如

    - set_fact:
        output: "{{ output|d([]) + [{'orgid': item.0,
                                     'objectIds': item.1|
                                                  map(attribute='id')|
                                                  list}] }}"
      loop: "{{ sample.json|groupby('organizationId') }}"

给予

  output:
  - objectIds:
    - '111222333444627213'
    - '111222333444627214'
    - '111222333444627216'
    orgid: '111222333444624074'
  - objectIds:
    - '111222333444627217'
    orgid: '12345678'