繁体   English   中英

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

[英]Traversing a uncalculable nested array backwards, node traversal - Javascript?

我有一个具有这样结构的对象

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

内部nodes可以是具有相同结构的任意数量的对象,但是父节点将被设置为以nodes数组为其属性的对象的父对象。 当对象遵循此模式时,顶级对象可能具有嵌套节点,这些嵌套节点可能非常深。

我想向顶层对象添加一个方法,该方法将反向搜索所有节点。 下面是我要实现的示例,但此功能正在向前搜索。

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

     this.searchForward: function() {

         this.nodes.forEach(function(node) {

             this.searchForward.call(this, node);
         }, this);
     }
}

上面的searchForward函数将搜索所有节点,直到它们能到达的深度searchForward ,然后移动到行中的下一个节点等,等等。

我正在尝试编写一个函数,该函数将从最深的孩子递归搜索到其父对象(本质上与上述相反)。

任何让我入门的想法都很棒,谢谢。

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

this.searchUp: function() {
    var parnt = this.parent;
    while (parnt) {
        // do something, if you want
        parnt = parnt.parnt;
    }
}

我考虑的第一件事是在“做某事”部分中调用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和完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM