具有多个分支的递归jq

  • 本文关键字:递归 jq 分支 json jq
  • 更新时间 :
  • 英文 :


我被卡住了。如何使用jq转换以下json:

{
"sitemap": {
"tree": {
"node": [
{
"text": "Main",
"blocks": {
"block": [
{
"title": "Header"
},
{
"title": "General"
},
{
"title": "Message"
},
{
"title": "Daily"
},
{
"title": "Recognition"
},
{
"title": "Policies"
},
]
},
"children": {
"node": [
{
"text": "Hub",
"blocks": null,
"children": {
"node": [
{
"text": "Handbook",
"blocks": null,
"children": null
},
{
"text": "Jobs",
"blocks": null,
"children": null
},
{
"text": "Perks",
"blocks": null,
"children": null
},
{
"text": "Benefits",
"blocks": null,
"children": null
}
]
}
},
{
"text": "Resources",
"blocks": null,
"children": {
"node": [
{
"text": "Forms",
"blocks": null,
"children": null
},
{
"text": "Procedures",
"blocks": null,
"children": null
},
{
"text": "Training",
"blocks": null,
"children": null
},
{
"text": "Scripts",
"blocks": null,
"children": null
},
{
"text": "Marketing",
"blocks": null,
"children": {
"node": [
{
"text": "Logos",
"blocks": null,
"children": null
},
{
"text": "Brochures",
"blocks": null,
"children": null
},
{
"text": "Signage",
"blocks": null,
"children": null
}
]
}
},
{
"text": "Tips & Tricks",
"blocks": null,
"children": null
}
]
}
},
{
"text": "About",
"blocks": null,
"children": {
"node": [
{
"text": "Strategy",
"blocks": null,
"children": null
}
]
}
}
]
}
},
{
"text": "Search",
"blocks": null,
"children": null
},
{
"text": "Logins",
"blocks": null,
"children": {
"node": [
{
"text": "One",
"blocks": null,
"children": null
},
{
"text": "Two",
"blocks": null,
"children": null
}
]
}
}
]
}
}
}

进入所有页面的列表中,并使用";块";包含在括号中。

[
[ "Main" ],
[ "Main", "(Header)" ],
[ "Main", "(General)" ],
[ "Main", "(Message)" ],
[ "Main", "(Daily)" ],
[ "Main", "(Recognition)" ],
[ "Main", "(Policies)" ],
[ "Main", "Hub" ],
[ "Main", "Hub", "Handbook" ],
[ "Main", "Hub", "Jobs" ],
[ "Main", "Hub", "Perks" ],
[ "Main", "Hub", "Benefits" ],
[ "Main", "Resources" ],
[ "Main", "Resources", "Forms" ],
[ "Main", "Resources", "Procedures" ],
[ "Main", "Resources", "Training" ],
[ "Main", "Resources", "Scripts" ],
[ "Main", "Resources", "Marketing" ],
[ "Main", "Resources", "Marketing", "Logos" ],
[ "Main", "Resources", "Marketing", "Brochures" ],
[ "Main", "Resources", "Marketing", "Signage" ],
[ "Main", "Resources", "Tips & Tricks" ],
[ "Main", "About" ],
[ "Main", "About", "Strategy" ],
[ "Search" ],
[ "Logins" ],
[ "Logins", "One" ],
[ "Logins", "Two" ]
]

这里有一种方法:

def nodes:
.node[] | [.text] + (
[],
(.blocks.block[]? | ["((.title))"]),
(.children | nodes?)
);
[.sitemap.tree | nodes]
[
["Main"],
["Main","(Header)"],
["Main","(General)"],
["Main","(Message)"],
["Main","(Daily)"],
["Main","(Recognition)"],
["Main","(Policies)"],
["Main","Hub"],
["Main","Hub","Handbook"],
["Main","Hub","Jobs"],
["Main","Hub","Perks"],
["Main","Hub","Benefits"],
["Main","Resources"],
["Main","Resources","Forms"],
["Main","Resources","Procedures"],
["Main","Resources","Training"],
["Main","Resources","Scripts"],
["Main","Resources","Marketing"],
["Main","Resources","Marketing","Logos"],
["Main","Resources","Marketing","Brochures"],
["Main","Resources","Marketing","Signage"],
["Main","Resources","Tips & Tricks"],
["Main","About"],
["Main","About","Strategy"],
["Search"],
["Logins"],
["Logins","One"],
["Logins","Two"]
]

演示

我想明白了,但如果有更好的方法,请告诉我,我会将其标记为已接受的答案。

def b($path):
[ $path[], "((.title?))" ]
;
def n($path):
($path + [.text]) as $path
| $path, 
if has ("blocks") then .blocks.block?[]? | b($path) else empty end,
if has ("children") then .children.node?[]? | n($path) else empty end
;
.sitemap.tree.node[] | n([])

最新更新