向后遍历不可计算的嵌套数组,节点遍历-Javascript?

向后遍历不可计算的嵌套数组,节点遍历-Javascript?,javascript,arrays,recursion,Javascript,Arrays,Recursion,我有一个物体,它的结构是这样的 { this.parent: undefined, this.nodes: [] } 在节点内部可以是具有相同结构的任意数量的对象,但是父对象将被设置为具有节点数组作为其属性的对象的父对象。由于对象遵循此模式,顶层对象可能具有嵌套的节点,这些节点可能相当深 我想向顶层对象添加一个方法,该方法将反向搜索所有节点。下面是我试图实现的一个示例,只是这个函数正在向前搜索 { this.parent: undefined, this.n

我有一个物体,它的结构是这样的

{
    this.parent: undefined,
    this.nodes: []
}
节点内部
可以是具有相同结构的任意数量的对象,但是父对象将被设置为具有节点数组作为其属性的对象的父对象。由于对象遵循此模式,顶层对象可能具有嵌套的节点,这些节点可能相当深

我想向顶层对象添加一个方法,该方法将反向搜索所有节点。下面是我试图实现的一个示例,只是这个函数正在向前搜索

{
     this.parent: undefined,
     this.nodes: [],

     this.searchForward: function() {

         this.nodes.forEach(function(node) {

             this.searchForward.call(this, node);
         }, this);
     }
}
上面的
searchForward
功能将尽可能深入地搜索所有节点,然后移动到行中的下一个节点等

我正在尝试编写一个函数,该函数将递归地从最深的子级搜索回父级(基本上与上面相反)


任何让我开始学习的想法都会很好,谢谢。

首先,如果您只想沿着路径返回到根,那很简单。(不过,我很确定这不是你想要的。)

我考虑的第一件事是在“做点什么”部分调用
searchForward
。这可能行得通,但给我的印象是效率低下——每次你上到另一个父节点,你都会搜索你已经搜索过的节点。不过,这本身应该是可行的。(只要您从searchUp调用searchForward,就没有无限循环的风险。)

我们只需添加一个标志,就可以使它变得更复杂,并避免冗余。您需要修改
searchForward
,并创建一个类似的函数:

this.initializeSearched: function() {
     this.nodes.forEach(function(node) {
         this.searched = false;
         this.initializeSearched.call(this, node);
     }, this);
 }
this.searchForward: function() {
     this.nodes.forEach(function(node) {
         if (this.searched) { continue; }
         this.searchForward.call(this, node);
     }, this);
 }

一旦你有了这个,你应该能够把
searchForward
放在
searchUp
的“做点什么”部分,然后就可以完成了。

首先,如果你只想遍历路径回到根目录,那很简单。(不过,我很确定这不是你想要的。)

我考虑的第一件事是在“做点什么”部分调用
searchForward
。这可能行得通,但给我的印象是效率低下——每次你上到另一个父节点,你都会搜索你已经搜索过的节点。不过,这本身应该是可行的。(只要您从searchUp调用searchForward,就没有无限循环的风险。)

我们只需添加一个标志,就可以使它变得更复杂,并避免冗余。您需要修改
searchForward
,并创建一个类似的函数:

this.initializeSearched: function() {
     this.nodes.forEach(function(node) {
         this.searched = false;
         this.initializeSearched.call(this, node);
     }, this);
 }
this.searchForward: function() {
     this.nodes.forEach(function(node) {
         if (this.searched) { continue; }
         this.searchForward.call(this, node);
     }, this);
 }

一旦你有了这个,你应该可以把
searchForward
放在
searchUp
的“做点什么”部分,然后就可以完成了。

你的意思是从最深的孩子身上搜索回到父母身上吗?是的,我会编辑我的问题,我很难解释它。但是这个对象看起来不正确,这是一个构造函数还是什么,因为它不是一个文本对象…我只是键入了它quick@user2251919,你能键入一个示例对象吗?对我们来说,在寻找解决方案的过程中试着摆弄它会容易得多。你的意思是从最深的孩子返回到父母吗?是的,我会编辑我的问题,我很难解释它。但那个对象看起来不正确,这是一个构造函数还是什么,因为它不是一个文本对象…我只是键入了它quick@user2251919,你能键入一个示例对象吗?对我们来说,在寻找解决方案的过程中尝试摆弄它会容易得多。这太棒了,我会尝试实现它,并让你知道我是如何做到的!这真是太棒了,我会努力实现它,让你知道我的进展如何!