JQ, как объединить несколько объектов в массиве в один (2) - PullRequest
0 голосов
/ 30 января 2019

Немного сложнее, чем мой предыдущий вопрос .Недостающие индексы тоже запутывают.

Ввод:

{
  "a": [
    { "b": 1, "d": "p" },

    { "b": 3, "d": "r" },
    { "b": 4, "d": "s" }
  ],
  "h": [
    { "b": 1, "i": "k" },
    { "b": 2, "i": "l" },

    { "b": 4, "i": "n" }
  ]
}

Желаемый вывод:

{
  "q": [
    { "b": 1, "d": "p", "i": "k" },
    { "b": 2, "i": "l" },
    { "b": 3, "d": "r" },
    { "b": 4, "d": "s", "i": "n" }
  ]
}

Пробовал:

jq '[.a, .h ] | transpose | map(add)| {l: .}'
jq '[ .a[] , .h[] ] | unique_by(.b) | { l: sort_by(.b) }'
jq '[ .a[] + .h[] ] | unique_by(.b) | { l: sort_by(.b) }'
jq '[ .a[] * .h[] ] | unique_by(.b) | { l: sort_by(.b) }'

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вот решение, использующее обобщенную функцию aggregate_by, определенную следующим образом:

def aggregate_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += [$x|g]);

Во-первых, обратите внимание, что с этим определением:

aggregate_by(.a[], .h[]; .b|tostring; .)[]
| add

создает требуемый массив за исключениемупорядочение элементов.Если упорядочение элементов в выходном массиве неважно, то вышеприведенное может быть изменено, чтобы обеспечить простое решение, не включающее group_by, что влечет за собой сортировку.

Для получения желаемого (отсортировано поб) вывод, мы могли бы настроить вышеперечисленное следующим образом:

{q: [aggregate_by(.a[], .h[]; .b|tostring; .)[]]
    | map(add)
    | sort_by(.b) }
0 голосов
/ 30 января 2019

Используйте group_by для группировки элементов массива по выходным данным фильтра (.b в этом случае):

jq '{ q : [ add | group_by(.b)[] | add ] }' file
...