Han*_*eck 5 arrays json nested jq
这是我的数据结构:
[
{
"name": "name1",
"organizations": [
{
"name": "name2",
"spaces": [
{
"name": "name3",
"otherkey":"otherval"
},
{
"name": "name4",
"otherkey":"otherval"
}
]
}
]
},
{
"name": "name21",
"organizations": [
{
"name": "name22",
"spaces": [
{
"name": "name23",
"otherkey":"otherval"
},
{
"name": "name24",
"otherkey":"otherval"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我只想保留 name=name1,删除 name=name4 的嵌套数组对象,并希望保持对象的其余部分完好无损。我尝试使用 map(select) 但这只会给我完整的对象。是否可以在特定子数组上使用 del 并保持其余部分不变?
结果应该如下。此外,我想避免枚举保留在外部对象上的所有属性:
[
{
"name": "name1",
"organizations": [
{
"name": "name2",
"spaces": [
{
"name": "name3",
"otherkey":"otherval"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
任何想法?谢谢!
一个非常有针对性的解决方案是:
path(.[0].organizations[0].spaces) as $target
| (getpath($target) | map(select(.name != "name4"))) as $new
| setpath($target; $new)
Run Code Online (Sandbox Code Playgroud)
不过,如果允许的话,您可以考虑:
walk(if type == "object" and .spaces|type == "array"
then .spaces |= map(select(.name != "name4"))
else . end)
Run Code Online (Sandbox Code Playgroud)
或者:
del(.. | .spaces? // empty | .[] | select(.name == "name4") )
Run Code Online (Sandbox Code Playgroud)
(如果你的 jq 没有walk/1,那么可以通过谷歌搜索轻松找到它的 jq 定义。)