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

时间:2013-05-20 04:03:01

标签: javascript arrays recursion

我有一个具有类似结构的对象

{
    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函数将搜索所有节点尽可能深,然后移动到行等下一个节点等等。

我正在尝试编写一个函数,它将从最深的孩子递归搜索回父母(基本上反过来)。

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

1 个答案:

答案 0 :(得分: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的“执行某事”部分即可完成。