有条件地从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
没有问题^^