返回
使用 jq 命令巧妙合并 JSON 数组,添加属性轻松搞定!
Linux
2024-03-03 01:03:41
使用 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 命令合并数组,我们按照以下步骤:
- 选择目标数组: 使用
.componentsByProdTourId
选择要合并的目标数组。 - 应用映射函数: 使用
map
函数遍历目标数组中的每个元素。 - 添加新属性: 使用
+
运算符将ticketData
中的属性添加到每个元素中。 - 更新数组: 将修改后的元素重新分配给目标数组。
以下 jq 命令实现了这些步骤:
.componentsByProdTourId |= map(. + {ticketId: .ticketData.ticketId, requester_id: .ticketData.requester_id})
解释
.componentsByProdTourId
选择componentsByProdTourId
数组。map(. + {ticketId: .ticketData.ticketId, requester_id: .ticketData.requester_id})
使用map
遍历数组中的每个元素,并为每个元素添加ticketId
和requester_id
属性。+
运算符将ticketData
中的属性添加到每个元素中。|=
运算符更新componentsByProdTourId
数组。
输出
运行此命令会生成以下 JSON 输出,其中 componentsByProdTourId
数组中的每个对象都包含 ticketId
和 requester_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 数组。通过利用其映射、追加和更新功能,你可以轻松地将一个数组中的属性添加到另一个数组中的每个对象中。本教程提供了逐步指南和示例,帮助你理解该过程。