1

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

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

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

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

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

     this.searchForward: function() {

         this.nodes.forEach(function(node) {

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

上面的searchForward函数将搜索所有节点尽可能深,然后移动到队列中的下一个节点等等等等。

我正在尝试编写一个函数,该函数将从最深的孩子递归搜索到父母(基本上是上面的反向)。

任何让我开始的想法都会很棒,谢谢。

4

1 回答 1

1

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

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并完成。

于 2013-05-20T05:15:05.753 回答