Объединить массивы под тем же ключом - PullRequest
1 голос
/ 08 ноября 2019

У меня есть два файла, содержащие объекты. Поля каждого объекта являются массивами объектов. Я хотел бы объединить массивы объектов по каждому ключу.

Я попытался получить список всех ключей по jq -s '.[0] * .[1] | to_entries[].key ' file1.json file2.json. Я не уверен, как бы вы сопоставили ключи от. [1] до. [0], как только вы захватили массивы объектов.

file1.json

{
    "foo": [
        {
            "nested": "object"
        }
    ],
    "bar": [
        {
            "nested": "object.bar"
        }
    ]

}

file2.json

{
    "foo": [
        {
            "nested": "object.foo2"
        }
    ],
    "baz": [
        {
            "nested": "object.baz"
        }
    ]

}

merged.json

{
    "foo": [
        {
            "nested": "object"
        },
        {
            "nested": "object.foo2"
        },

    ]
    "bar": [
        {
            "nested": "object.bar"
        }
    ]
    "baz": [
        {
            "nested": "object.baz"
        }
    ]

}

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Вы можете использовать следующее:

map(to_entries) | add | group_by(.key) | map({ key: (.[0].key), value:([.[].value | add]) }) | from_entries

Попробуйте здесь .

map(to_entries) измените каждый из ваших файлов в массив пар ключ / значение.

add объединить эти два массива в один.

group_by(.key) изменяет содержимое массива на несколько массивов, которые перегруппируют объекты с одним и тем же ключом.

map({ key: (.[0].key), value:([.[].value | add]) }) преобразует эти массивы в объект с парой ключ / значение, ключом которого является исходный ключ, а значением являются объединенные значения различных объектов с этим ключом.

from_entries воссоздает объект измассив объектов ключ / значение.

2 голосов
/ 08 ноября 2019

Использование вложенных reduce s:

reduce inputs as $in (.;
  reduce ($in | keys_unsorted[]) as $k (.;
    .[$k] += $in[$k]
  )
)

jqplay demo

...