使用 jq 合并具有公共键的对象的 属性 个值

Merging property values of objects with common key with jq

我有一个包含 2 个属性的对象数组,比如“键”和“值”:

[
   {key: 1, value: a}, 
   {key: 2, value: b}, 
   {key: 1, value: c}
]

现在,我想合并具有相同“键”属性 值的对象的“值”属性的值。即把之前的数组转化为:

[
   {key: 1, value: [a, c]}, 
   {key: 2, value: [b]}
]

我试过类似的方法:

$ echo '[{"key": "1", "val": "a"}, {"key": "2", "val": "b"}, {"key": "1", "val": "c"}]' | jq '. | group_by(.["key"]) | .[] | reduce .[] as $in ({"val": []}; {"key": $in.key, "val":  [$in.val] + .["val"]})'

但它触发了 jq 语法错误,我不知道为什么。我卡住了。

有什么想法吗?

谢谢

B

您使用 reduce 的方法可以净化为

jq 'group_by(.["key"]) | .[] |= reduce .[] as $in (
  {value: []}; .key = $in.key | .value += [$in.value]
)'
[
  {
    "value": [
      "a",
      "c"
    ],
    "key": 1
  },
  {
    "value": [
      "b"
    ],
    "key": 2
  }
]

Demo

另一种使用 map 的方法是

jq 'group_by(.key) | map({key: .[0].key, value: map(.value)})'
[
  {
    "key": 1,
    "value": [
      "a",
      "c"
    ]
  },
  {
    "key": 2,
    "value": [
      "b"
    ]
  }
]

Demo