有人可以帮助我获取正确的jq命令来拼合以下示例吗?我看过其他几篇文章,但我对此不屑一顾,但似乎无法理解。非常感谢您的帮助。
输入:
[
{
"name": "level1",
"children": [
{
"name": "level2",
"children": [
{
"name": "level3-1",
"children": []
},
{
"name": "level3-2",
"children": []
}
]
}
]
}
]
输出:
[
{
"displayName": "level1",
"parent": ""
},
{
"displayName": "level2",
"parent": "level1"
},
{
"displayName": "level3-1",
"parent": "level2"
},
{
"displayName": "level3-2",
"parent": "level2"
}
]
答案 0 :(得分:1)
具有简单的递归功能:
def f: .name as $parent | .children[] | {$parent, displayName: .name}, f;
[ {name: "", children: .} | f ]
答案 1 :(得分:1)
这是一个简单的解决方案,不涉及辅助函数,实际上解决了更一般的问题。它基于以下想法:首先为每个孩子添加一个“父”键,然后使用..
来收集所有名称/父对。
所以首先考虑:
[ walk(if type=="object" and has("children")
then .name as $n | .children |= map(.parent = $n)
else . end)
| ..
| select(type=="object" and has("name"))
| {displayName: .name, parent}
]
这满足要求,但顶级(无父)对象的.parent值为null
。通常,它比“”更具JSON风格,但是如果确实需要空字符串,则只需将上面的最后一条不平凡的行替换为:
| {displayName: .name, parent: (.parent // "")}