如何使用 jq 将对象列表转换为列表对象?

How to transform list of objects into object of lists using jq?

假设我有一些 JSON 看起来像:

[
    {"foo": "apple", "bar": 42},
    {"foo": "pear", "bar": 13},
    {"foo": "apple", "bar": 666}
]

我怎样才能把它变成类似这样的东西:

{
   "apple": [42, 666],
   "pear": [13],
}

barfoo 分组?

到目前为止,我已经尝试使用 jqgroup_by(...) 函数,它给了我:

[
  [{"foo": "apple", "bar": 42}, {"foo": "apple", "bar": 666}],
  [{"foo": "pear", "bar": 13}]
]

这是一个开始,但不是我想要的。

您可以使用 group_by 并在之后进行转换,即用 .foo 形成密钥并添加所有 .bar

group_by(.foo)[] | { (.[0].foo): [.[].bar] }

jqplay - demo

一个简单有效的解决方案将避免 group_by,其实现目前需要排序操作:

reduce .[] as $x ({}; .[$x.foo] += [$x.bar])