我想根据同一个数组中另一个元素的值有条件地更新元素值。
例如,我想找到name ==“weather”并将检查从“true”更改为“false”
[
{
"originalSourceId": null,
"sourceConnection": {
"id": null,
"version": null,
"properties": [
{
"id": null,
"version": null
}
],
"name": "POSTGRESQL",
"businessName": null
},
"checked": true,
"newlyAdded": false,
"discoveredEntities": [
{
"name": "weather",
"checked": true,
"checkedBeforeEdit": false,
"storeFieldsAsStrings": false
},
{
"name": "weather_2",
"checked": true,
"checkedBeforeEdit": false,
"storeFieldsAsStrings": false
}
],
"defaultLevel": "MANAGED"
}
]
对于名称=“天气”的同一对象,checked元素将更新为“false”
[
{
"originalSourceId": null,
"sourceConnection": {
"id": null,
"version": null,
"properties": [
{
"id": null,
"version": null
}
],
"name": "POSTGRESQL",
"businessName": null
},
"checked": true,
"newlyAdded": false,
"discoveredEntities": [
{
"name": "weather",
"checked": false,
"checkedBeforeEdit": false,
"storeFieldsAsStrings": false
},
{
"name": "weather_2",
"checked": true,
"checkedBeforeEdit": false,
"storeFieldsAsStrings": false
}
],
"defaultLevel": "MANAGED"
}
]
对于这些类型的更新,如果您以这种方式考虑它,更容易可视化,首先找到要更新的项目,然后更新它们。
(.[].discoveredEntities[] | select(.name == "weather").checked) = false
#[ locate the items to update ]
# [ update them ]
弄清楚了。
jq '[.[].discoveredEntities[] |= if (.name=="weather") then (.checked = "false") else . end]'\
./test.json
在这里使用map
产生一个非常简单的行人解决方案:
map( .discoveredEntities |=
map(if .name == "weather" then .checked = false else . end))
请注意,在这里使用false
而不是"false"
显然更合适。