Arrays JQ:将对象数组缩减为对象,添加到数组中

Arrays JQ:将对象数组缩减为对象,添加到数组中,arrays,json,addition,jq,Arrays,Json,Addition,Jq,我有一个更复杂的JQ表达式,它处理一个对象数组 输入如下所示: [ { "key": "1", "value": "value 1"}, { "key": "2", "value": "value 2"}, { "key": "1", "value": "value 3"}, ] 我想得到的是: { "1": { "values": ["value 1", "value 3"] }, "2": { "values": ["value 2"] } } 或

我有一个更复杂的JQ表达式,它处理一个对象数组

输入如下所示:

[
    { "key": "1", "value": "value 1"},
    { "key": "2", "value": "value 2"},
    { "key": "1", "value": "value 3"},
]
我想得到的是:

{
    "1": { "values": ["value 1", "value 3"] },
    "2": { "values": ["value 2"] }
}
或者,对于我的用例:

{
    "1": [ "value 1", "value 3" ],
    "2": [ "value 2" ]
}
也可以


我已经尝试过使用
…|{(.key):[.value]}
,但结果是(我并不感到惊讶)以后出现的键只会覆盖已经存在的键。我想要完成的是“创建一个新的键/值对或向一个已经存在的“值”数组添加.value”。

好的,在最终找到我想要的东西之后,我还了解到我以前的过滤器没有保留输入数组,而是导致对象依次输出。这就是我发现的所有例子都不起作用的原因

我想按键分组(因此需要键/值),而group_by已经这样做了,但不起作用

从分组工作到我的解决方案(唯一键、数组中的值),这只是一小步

现在输出如下所示,完全符合我的要求:

[
    {
        "key": "1",
        "values": [
            "value 1",
            "value 3"
        ],
    },
    {
        "key": "2",
        "values": [
            "value 2"
        ]
    }
]

依赖于
group\u by
的解决方案的缺点是
group\u by
需要排序,这在这里是不必要的。在这个响应中,我将展示如何通过使用一个通用(并且通常很有用)的jq函数来避免任何排序,该函数“融合”一个JSON对象数组,基本上是通过将每个键处的值弹出到一个数组中,然后连接相应的数组

# input should be an array of objects
def meld:
  reduce .[] as $o
    ({}; reduce ($o|keys)[] as $key (.; .[$key] += [$o[$key]] ));
我们还要定义一些数据:

def data:
[
    { "key": "1", "value": "value 1"},
    { "key": "2", "value": "value 2"},
    { "key": "1", "value": "value 3"}
]
;
然后,过滤器:

data |  map([.] | from_entries) | meld
产生:

{"1":["value 1","value 3"],"2":["value 2"]}
{"1":["value 1","value 3"],"2":["value 2"]}