Concat 2 массива внутри объекта на основе ключа / значения объекта - PullRequest
2 голосов
/ 23 марта 2019

У меня есть несколько объектов json, которые могут быть меньше, когда я объединяю массивы, если ключ объекта совпадает со значением следующего объекта json.Я пытаюсь сделать это с помощью jq.

Я думаю, что я должен сначала использовать group_by (.name) для группировки соответствующих ключей.Я также использую slurp, чтобы сначала обернуть все объекты в один большой массив.

Пока у меня ничего не работает.

учитывая:

{
    "name": "a",
    "list": [ "a1", "a2" ]
}
{
    "name": "a",
    "list": [ "a3", "a4" ]
}
{
    "name": "b",
    "list": [ "b1", "b2" ]
}

результат:

{
    "name": "a",
    "list": [ "a1", "a2", "a3", "a4" ]
}
{
    "name": "b",
    "list": [ "b1", "b2" ]
}

Ответы [ 3 ]

3 голосов
/ 23 марта 2019

Вы можете использовать reduce так:

$ jq -c -n 'reduce inputs as $p ({}; .[$p.name] |= { name : $p.name, list : (.list + $p.list) }) | .[]' file
{"name":"a","list":["a1","a2","a3","a4"]}
{"name":"b","list":["b1","b2"]}
1 голос
/ 23 марта 2019

Вот простое и эффективное решение, которое использует общую технику «агрегирования по»:

reduce inputs as $kv ({}; .[$kv.name] += $kv.list)
| keys_unsorted[] as $k
| {name: $k, list: .[$k]}

Поскольку здесь использовалось inputs, следует указать параметр командной строки -n для jq.

0 голосов
/ 02 апреля 2019

в качестве альтернативы, вы можете использовать утилиту Unix на основе пешеходного пути jtc для реализации вашего запроса:

bash $ <file.json jtc -J | jtc -w'[name]:<dup>Q:[^0]<dup>s[-1][list]' -mi'[name]:<dup>Q:[-1][list]' | jtc -w'[name]:<.>q:[-1]' -r
{ "list": [ "a1", "a2", "a3", "a4" ], "name": "a" }
{ "list": [ "b1", "b2" ], "name": "b" }
bash $ 

(дано -rтолько для краткости вывода)

...