2015-02-08 56 views
2

我想創建,每一個節點連接到它的子圖JavaScript的瀏覽每個節點在圖

function Node (value) { 
    this.value = value; 
    this.childs = []; 
    this.mark = false; 
} 

這是我的圖

var nodes = [new Node (0), new Node (1), new Node (2), new Node (3), new Node (4)]; 

nodes[0].childs.push (nodes[1]); 
nodes[1].childs.push (nodes[0]); 

nodes[1].childs.push (nodes[2]); 
nodes[2].childs.push (nodes[1]); 

nodes[1].childs.push (nodes[4]); 
nodes[4].childs.push (nodes[1]); 

nodes[2].childs.push (nodes[3]); 
nodes[3].childs.push (nodes[2]); 

應該是這樣的

graph

現在我想訪問每個節點

function visit (node) { 
    node.mark = true; 
    for (i=0; i<node.childs.length; i++) 
     if (!node.childs[i].mark) 
      visit (node.childs[i]); 
} 

但是節點4永遠不會被訪問我不會無視的東西。 參見行動:http://jsfiddle.net/jhdLhz44/

如果有人可以幫忙,會很好。 Thx

回答

1

您的i是全球範圍內的產品。

因此,對子數組的迭代使用相同的i並相互干擾。

通過添加var將其作爲本地變量。

for (var i=0; i<node.childs.length; i++) 
    if (!node.childs[i].mark) 
     visit (node.childs[i]); 

FYI,更漂亮的和不易出錯的方法是使用Array.prototype.forEach

node.childs.forEach(function(child) { 
    if (!child.mark) 
     visit (child); 
}); 
0

我認爲結構化的數據作爲對象,而不是與子陣列將簡化的陣列的東西。

如果你組織你的數據是這樣的:

var nodes = { 
    "0": { 
     mark: false, 
     "1": { 
      mark: false, 
      "2": { 
       "3": { 
        mark: false 
       } 
      }, 
      "4": { 
       mark: false 
      } 
     } 
    } 
} 

然後,您可以更輕鬆地訪問每個節點是這樣的:

(function visit(obj) { 
    obj.mark = true; 
    for (var key in obj) { 
     if (typeof obj[key] === 'object') { 
      visit(obj[key]); 
     } 
    } 
})(nodes); 

JSFiddle例子。

所以你真正需要解決的,我認爲,你的構造函數是如何工作的。祝你好運:)

+0

這個結構不提供圖表,只有一棵樹 – flappix 2015-03-26 20:13:06

相關問題