在Javascript中的嵌套对象数组中查找目标对象的路径

在Javascript中的嵌套对象数组中查找目标对象的路径,javascript,arrays,depth-first-search,Javascript,Arrays,Depth First Search,我目前正在解决一个问题,即在确定需要在对象数组中的何处查找子节点时遇到一些问题。目标可以是一个或多个深度 问题是,一旦找到对象,我还需要将到达该对象的路径推送到生成的数据数组中 目前,我已经编写了可以成功找到子节点的代码: const buildFullTree = (tree, cat, data = []) => { let collection = [tree] while (collection.length) { let node = collection.sh

我目前正在解决一个问题,即在确定需要在对象数组中的何处查找子节点时遇到一些问题。目标可以是一个或多个深度

问题是,一旦找到对象,我还需要将到达该对象的路径推送到生成的数据数组中

目前,我已经编写了可以成功找到子节点的代码:

const buildFullTree = (tree, cat, data = []) => {
  let collection = [tree]

  while (collection.length) {
    let node = collection.shift()

    if (node.id === cat.id) {
      data.push(node)
    }

    collection.unshift(...node.children)
  }

  return data
}
但是,就获取该对象的路径而言,这是不够的


我很确定我需要将其更改为递归深度优先搜索解决方案,以实现我所寻找的内容,但我不确定如何更改while循环来实现这一点。

如果我正确理解您的问题,那么您也许可以修改路径搜索功能,这样可以实现您所需要的:

constbuildfulltree=(部门树、类别、数据=[])=>{
const findPath=(节点,类别)=>{
//如果当前节点与搜索节点匹配,则返回路径结果的尾部
if(node.id==category.id){
返回[节点]
}否则{
//如果当前节点不匹配,请首先检查子节点
//返回数组(路径)的子级,将当前节点前置到该子级
//路径结果
for(node.children的常量子节点){
const childPath=findPath(子级,类别)
if(Array.isArray(childPath)){
childPath.unshift(子级)
返回子路径
}
}
}
}
const foundPath=findPath(部门树,类别)
//如果“从根目录搜索”返回路径,请将根节点前置到中的路径
//数据结果
if(Array.isArray(foundPath)){
数据推送(部门树)
data.push(…foundPath)
}
返回数据
}
常量部门树={
id:5,
标题:"部门",,
级别:1,
儿童:[{
id:1,
家长编号:5,
标题:“类别”,
级别:2,
儿童:[{
身份证号码:15,
父ID:1,
标题:“子类别”,
级别:3,
儿童:[]
}, {
身份证号码:18,
父ID:1,
级别:3,
标题:“子类别”,
儿童:[]
}, {
身份证号码:26,
父ID:1,
级别:3,
标题:“子类别”,
儿童:[{
id:75,
家长编号:26,
级别:4,
标题:“子类别”,
儿童:[]
}, {
id:78,
家长编号:26,
级别:4,
标题:“子类别”,
儿童:[]
}]
}]
}, {
身份证号码:23823,
标题:“类别”,
级别:2,
儿童:[]
}, {
id:9,
家长编号:5,
级别:2,
标题:“类别”,
儿童:[{
id:48414,
父ID:9,
级别:3,
标题:“子类别”,
儿童:[]
}, {
身份证号码:2414,
父ID:9,
级别:3,
标题:“子类别”,
儿童:[]
}, {
身份证号码:42414,
父ID:9,
级别:3,
标题:“子类别”,
儿童:[{
身份证号码:2323213,
父ID:42414,
级别:4,
标题:“子类别”,
儿童:[]
}, {
身份证号码:322332,
父ID:42414,
级别:4,
标题:“子类别”,
儿童:[]
}]
}]
}]
};
log('到23213的路径:',
buildFullTree(部门树{
身份证号码:2323213
}).map(node=>node.id).join('->'))
console.log('指向23823的路径:',
buildFullTree(部门树{
身份证号码:23823
}).map(node=>node.id).join('->'))
log('-1(不存在的节点)的路径):',
buildFullTree(部门树{
身份证:-1

}).map(node=>node.id).join('->')
Yes就是这样!成功了!非常感谢:D.我很好奇是否有一种方法可以重构findPath,使其不必在数组中返回类别,但这种方法很好。这取决于您需要如何表示/返回
路径。可以以字符串形式返回路径:
5、9、42414、232323213、2323213
-这对您有用吗?是的,可以。还有一个问题。我看到我们正在返回一个匹配的空数组。这是为了方便for循环内部的逻辑吗?在我读到这篇文章的方式中,它基本上构建了一条穿过子对象的路径,直到找到匹配项为止。找到匹配项后,我们返回一个空数组,然后childpath可以将子项反移位到该数组中,从而返回所需的路径。我只是想确定这是真的。