jq: сопоставление массива в объекте с другим объектом с сохранением родительских ключей и добавлением новых - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы отобразить следующую структуру

{
    "id" : "OUTER_ID",
    "name" : "OUTER_NAME"
    "items" : [ 
        {   
            "id" : "INNER_ID_1",
            "name" : "INNER_NAME_1",
        },
        {   
            "id" : "INNER_ID_2",
            "name" : "INNER_NAME_2",
        }
    ]   
}

в это

{
    "payload": [
        {   
            "key" : "INNER_NAME_1_KEY",
            "data" : { 
                "id" : "OUTER_ID",
                "name" : "OUTER_NAME",
                "items" : [ 
                    {   
                        "id" : "INNER_ID_1",
                        "name" : "INNER_NAME_1"
                    }   
                ]   
            }   
        },  
        {   
            "key" : "INNER_NAME_2_KEY",
            "data" : { 
                "id" : "OUTER_ID",
                "name" : "OUTER_NAME",
                "items" : [ 
                    {
                        "id" : "INNER_ID_2",
                        "name" : "INNER_NAME_2"
                    }
                ]
            }
        }
    ]
}

Итак, для каждого элемента в исходном массиве items я хочу создать запись в payload выходных данных, то есть я хочу сопоставить items[i] с payload[i].data.items, одновременно создавая payload, key и data клавиши на выходе и установка payload[i].data.id и payload[i].data.name на внешние входы id и name.

Можно ли это сделать с помощью jq?

1 Ответ

1 голос
/ 28 марта 2019

Конечно, вы можете использовать следующий фильтр:

.id as $id | .name as $name | {payload : [ .items[] | {key:.id, data:{id:$id, name: $name, items:[.]}} ] }

Вы можете попробовать здесь .

...