首页 > 解决方案 > 使用 jq 在某个键上组合两个对象数组

问题描述

我正在尝试使用jq来解决这个问题。

假设我有以下对象

{
  "listA": [
    {
      "id": "12345",
      "code": "001"
    }
  ]
  "listB": [
    {
      "id": "12345",
      "prop": "AABBCC"
    }
  ]
}

实际上,我的两个列表更长,但id每个列表中都没有重复。

如何将这两个列表组合成一个列表,其中每个项目都是一个对象,id给定的非属性id被收集到一个对象中?

例如,从上面的对象中,我想要以下内容:

{
  "listC" : [
    {
      "id": "12345",
      "code": "001",
      "prop": "AABBCC"
    }
  ]
}

标签: jq

解决方案


一种简单的方法是连接数组,按 id 对元素进行分组,然后使用 ; 将每个组映射到单个对象中add

jq '.listA+.listB | group_by(.id) | map(add)' test.json

如果文件中可能需要合并两个以上的数组,则可以改为使用flatten来连接所有数组。

下面的测试用例

# cat test.json

{
  "listA": [
    { "id": "12345", "code": "001" },
    { "id": "12346", "code": "002" }
  ],
  "listB": [
    { "id": "12345", "prop": "AABBCC" }
  ]
}

# jq 'flatten | group_by(.id) | map(add)' test.json
# or
# jq '.listA+.listB | group_by(.id) | map(add)' test.json

[
  {
    "id": "12345",
    "code": "001",
    "prop": "AABBCC"
  },
  {
    "id": "12346",
    "code": "002"
  }
]

推荐阅读