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

发布于 2025-01-11 05:07:13 字数 598 浏览 0 评论 0原文

我有一个具有 2 个属性的对象数组,例如“key”和“value”:

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

现在,我想将具有相同“key”属性值的对象的“value”属性的值合并。那就是前面的数组被转换成:

[
   {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

I have an array of objects with 2 properties, say "key" and "value":

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

Now, I would like to merge the values of the "value" properties of objects with the same "key" property value. That is the previous array is transformed into:

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

I tried something like:

$ 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"]})'

But it triggers a jq syntax error and I have no idea why. I am stuck.

Any idea ?

Thanks

B

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

¢蛋碎的人ぎ生 2025-01-18 05:07:13

您使用 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

另一种使用 的方法地图将是

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

演示

Your approach using reduce could be sanitized to

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

Demo

Another approach using map would be

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

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文