返回

使用 jq 命令巧妙合并 JSON 数组,添加属性轻松搞定!

Linux

使用 jq 命令合并数组

引言

在处理 JSON 数据时,合并数组是一个常见的任务。jq 命令提供了一种简洁的方法来执行此操作,本文将引导你完成使用 jq 命令合并数组的步骤,并将一个数组中的属性添加到另一个数组中的每个对象中。

获取示例数据

我们从一个包含两个数组的 JSON 对象开始:

{
  "componentsByProdTourId": [
    {
      "region": "Europe",
      "compSpec": {
        "country": "France",
        "attributes": [
          {
            "attributeCode": "ABC",
            "attributeType": "xyx"
          }
        ]
      }
    },
    {
      "region": "Europe",
      "compSpec": {
        "country": "France",
        "attributes": [
          {
            "attributeCode": "EFG",
            "attributeType": "lmn"
          }
        ]
      }
    },
    {
      "region": "Europe",
      "compSpec": {
        "country": "United Kingdom",
        "attributes": [
          {
            "attributeCode": "FLC",
            "attributeType": "omp"
          }
        ]
      }
    }
  ],
  "ticketData": {
    "ticketId": "1234",
    "requester_id": "99885"
  }
}

合并数组

使用 jq 命令合并数组,我们按照以下步骤:

  1. 选择目标数组: 使用 .componentsByProdTourId 选择要合并的目标数组。
  2. 应用映射函数: 使用 map 函数遍历目标数组中的每个元素。
  3. 添加新属性: 使用 + 运算符将 ticketData 中的属性添加到每个元素中。
  4. 更新数组: 将修改后的元素重新分配给目标数组。

以下 jq 命令实现了这些步骤:

.componentsByProdTourId |= map(. + {ticketId: .ticketData.ticketId, requester_id: .ticketData.requester_id})

解释

  • .componentsByProdTourId 选择 componentsByProdTourId 数组。
  • map(. + {ticketId: .ticketData.ticketId, requester_id: .ticketData.requester_id}) 使用 map 遍历数组中的每个元素,并为每个元素添加 ticketIdrequester_id 属性。
  • + 运算符将 ticketData 中的属性添加到每个元素中。
  • |= 运算符更新 componentsByProdTourId 数组。

输出

运行此命令会生成以下 JSON 输出,其中 componentsByProdTourId 数组中的每个对象都包含 ticketIdrequester_id 属性:

{
  "componentsByProdTourId": [
    {
      "region": "Europe",
      "compSpec": {
        "country": "France",
        "attributes": [
          {
            "attributeCode": "ABC",
            "attributeType": "xyx"
          }
        ]
      },
      "ticketId": "1234",
      "requester_id": "99885"
    },
    {
      "region": "Europe",
      "compSpec": {
        "country": "France",
        "attributes": [
          {
            "attributeCode": "EFG",
            "attributeType": "lmn"
          }
        ]
      },
      "ticketId": "1234",
      "requester_id": "99885"
    },
    {
      "region": "Europe",
      "compSpec": {
        "country": "United Kingdom",
        "attributes": [
          {
            "attributeCode": "FLC",
            "attributeType": "omp"
          }
        ]
      },
      "ticketId": "1234",
      "requester_id": "99885"
    }
  ],
  "ticketData": {
    "ticketId": "1234",
    "requester_id": "99885"
  }
}

常见问题解答

1. 我可以在不修改源对象的情况下合并数组吗?

是的,你可以使用 with 语句进行无损合并,如下所示:

.componentsByProdTourId | map(. + {ticketId: .ticketData.ticketId, requester_id: .ticketData.requester_id})

2. 如果目标数组中的元素没有匹配的属性怎么办?

在这种情况下,null 值将被添加到元素中。

3. 我可以合并嵌套数组吗?

是的,jq 允许你使用递归 map 函数合并嵌套数组。

4. 我可以使用 jq 命令合并具有不同结构的数组吗?

是的,但你需要使用自定义函数来处理不同结构。

5. 如何高效地合并大型数组?

对于大型数组,可以使用 group_by 函数将元素分组,然后应用 map 函数。

结论

jq 命令提供了一种强大且简洁的方法来合并 JSON 数组。通过利用其映射、追加和更新功能,你可以轻松地将一个数组中的属性添加到另一个数组中的每个对象中。本教程提供了逐步指南和示例,帮助你理解该过程。