JQ如何将数组中的多个对象合并为一(2)

时间:2019-01-30 09:00:30

标签: arrays json object add jq

比我的previous question还要复杂。缺少索引也会使事情变得混乱。

输入:

{
  "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 :(得分:2)

使用group_by通过过滤器的输出对数组元素进行分组(在这种情况下为.b

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

答案 1 :(得分:1)

这是使用通用函数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且需要排序的简单解决方案。

要产生所需的(按b排序)输出,我们可以对上述内容进行如下调整:

{q: [aggregate_by(.a[], .h[]; .b|tostring; .)[]]
    | map(add)
    | sort_by(.b) }