使用 jq 删除嵌套数组

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)

任何想法?谢谢!

pea*_*eak 5

一个非常有针对性的解决方案是:

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 定义。)