比我的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) }'
答案 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) }