我目前正在努力解决一些jq问题,希望有人能提供帮助。 给出的是以下 JSON 结构:
[
{
"id": "100",
"input": "ChecklistState",
"value": "-",
"sub": [
{
"id": "110",
"input": "Text",
"value": "foo",
"sub": []
},
{
"id": "120",
"input": "ChecklistState",
"value": "OK",
"sub": []
},
{
"id": "130",
"input": "ChecklistState",
"value": "OK",
"sub": []
},
{
"id": "140",
"input": "ChecklistState",
"value": "OK",
"sub": []
}
]
}
]
我需要一个过滤器,当输入类型“Text”的每个子项都没有空值并且每个输入类型“ChecklistState”的值都为“OK”时,该过滤器将父级(ID 100)的值更改为“OK”。 ( -> 110 不为空,120、130 和 140“OK”)
一个通用的过滤器(检查输入)会很棒,但我也不介意一个解决方案,我单独检查每个子ID。
我尝试过通过以下方式了解孩子们的价值观:
select(.sub[]?.id=="xxx").value
并将其连接到 if-then-else-end-Block 中,但结果是,条件似乎不起作用。
请注意:由于软件要求,我需要使用jq v1.5
这是在
.sub
数组上使用生成的索引对象的一种方法:
map( # process all items
if
.sub | map(.key = .id) | from_entries # create an index
| [."110" != "OK", .["120","130","140"] == "OK"] | all # match condition
then
.value = "OK"
else
.
end
)
[
{
"id": "100",
"input": "ChecklistState",
"value": "OK",
"sub": [
{
"id": "110",
"input": "Text",
"value": "foo",
"sub": []
},
{
"id": "120",
"input": "ChecklistState",
"value": "OK",
"sub": []
},
{
"id": "130",
"input": "ChecklistState",
"value": "OK",
"sub": []
},
{
"id": "140",
"input": "ChecklistState",
"value": "OK",
"sub": []
}
]
}
]