2013-05-20 59 views
1

我有一個具有像這樣向後遍歷不可計算的嵌套數組,節點遍歷 - Javascript?

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

內部nodes可以是任何數量具有相同的結構的對象的結構的對象,但也有父母會被設置爲具有節點陣列作爲對象的其屬性。由於對象遵循這種模式,頂層對象可能具有可能非常深的嵌套節點。

我想添加一個方法到頂級對象,將搜索所有的相反節點。我試圖實現的一個例子如下,只是這個函數正在向前搜索。

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

    this.searchForward: function() { 

     this.nodes.forEach(function(node) { 

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

searchForward以上功能將搜索所有節點深,因爲他們可以走了,然後移動到下一個節點線等等等等等等

我想編寫一個函數,將遞歸從最深的孩子回到父母(基本上是相反的)。

任何想法讓我開始將是偉大的,謝謝。

+0

你的意思是從最深的小孩回到父母身邊? – alex

+0

是的,我會編輯我的問題,我很難解釋它。 – user2251919

+0

但是,該對象看起來不正確,是一個構造函數或它是什麼,因爲它不是一個字面對象... – elclanrs

回答

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); 
} 

一旦你有了這個,你應該能夠只是把searchForwardsearchUp的「有所作爲」一節中和來完成。

+0

這真棒,我會盡力實現它,並讓你知道我如何繼續! – user2251919