有条件地从javascript中的嵌套数组中提取值
如何从嵌套数组中提取值列表;符合条件有条件地从javascript中的嵌套数组中提取值,javascript,recursion,multidimensional-array,nested,Javascript,Recursion,Multidimensional Array,Nested,如何从嵌套数组中提取值列表;符合条件 const tree = { "menu_id":"root", "open":true, "items":[ { "menu_id":"Brussels", "open":false, "items":[
const tree = {
"menu_id":"root",
"open":true,
"items":[
{
"menu_id":"Brussels",
"open":false,
"items":[
{
"menu_id":"Brussels/CBD",
"open":true,
"items":[
{
"menu_id":"Brussels/CBD/Centre",
"open":false
},
{
"menu_id":"Brussels/CBD/Louise",
"open":true
},
{
"menu_id":"Brussels/CBD/Léopold",
"open":false
},
{
"menu_id":"Brussels/CBD/Midi",
"open":true
},
{
"menu_id":"Brussels/CBD/North",
"open":false
}
]
}
]
}
]
}
我想获得一个菜单id值列表,其中open属性为false,因此将给出:
var closed = ['Brussels','Brussels/CBD/Centre','Brussels/CBD/Léopold','Brussels/CBD/North']
我怎么能这么做
谢谢 编写这篇文章的一个有用方法是构建一个通用函数,该函数处理各种类型的树和任意谓词,然后在此基础上构建您的函数 此版本执行此操作,然后部分应用描述树结构的函数以获取新函数,部分应用谓词以获取另一个函数,该函数接受树并返回与谓词匹配的所有节点。最后,我们的主函数接受一棵树,调用前面的函数,并从每个结果中提取id节点
constfilterdeep=(getKids)=>(pred)=>(tree)=>[
…(pred(tree)?[tree]:[]),
…(getKids(tree)).flatMap(filterDeep(getKids)(pred))
]
常数过滤器项=
filterDeep(({items=[]})=>items)
常数关闭=
filterItems(({open})=>!open)
const closedIds=(树)=>
关闭(树).map({menu\u id})=>menu\u id)
const-tree={menu-id:“root”,open:true,items:[{menu-id:“布鲁塞尔”,open:false,items:[{menu-id:“布鲁塞尔/CBD/Centre”,open:false},{menu-id:“布鲁塞尔/CBD/路易丝”,open:true},{menu-id:“布鲁塞尔/CBD/lopold”,open:false},{menu-id:“布鲁塞尔/CBD/Midi”,open:true},{menu-id:“布鲁塞尔/中央商务区/北部”,开放:假}]}]}
console.log(closedIds(tree))
请访问,查看和。做一些研究,搜索相关主题;如果遇到问题,请发布您的尝试,使用[]
代码段编辑器记录输入和预期输出。因此忽略菜单id:“根”,“打开”“:是的,
@mplungjan:虽然这个问题可能没有显示出足够的努力,但您建议的副本却完全不同。这一个正在寻找一种方法,将所有匹配的节点收集到一个数组中,而不考虑深度。这一个保持树结构完整,只保留匹配的叶节点。另一个filterDeep
用例:D@Thankyou当前位置我还是不确定这个名字。我使用两种不同风格的深度过滤。一个是创建一个匹配数组;另一种保留了树结构,但减少了节点数量。这两个名字似乎都不比另一个更值得命名为filterDeep
,但调用一个deepFilter
和另一个filterDeep
太令人困惑了。为了修剪树木但保持形状,我使用了名称prune
或shake
@谢谢:prune
,听起来不错。为此,我将保留deepFilter
。我应该澄清,prune
返回不带“过滤”位的树,而shake
返回“过滤”位。但是,deepFilter
没有问题^^