2012-09-25 95 views
1

我創建了一個與d3相關的對象的強制定向樹。節點和鏈接是使用d3樹佈局創建的。d3.js樹佈局 - 交叉鏈接

的數據結構如下:

{ 
    "name": "node name", 
    "id": 1, 
    "children": [ 
    { 
     "name": "child node name", 
     "id": 2 
    }, 
    { 
     "name": "child node name", 
     "id": 3 
    }, 
    ... 
    ] 
}, 
... 

的/鏈接創建下列方式節點:

var nodes = flatten(rootNode); 
var links = d3.layout.tree().links(nodes); 

爲了使樹的雙向穿越,我遞歸從走在樹每個新創建的節點並向所有節點添加父引用。

可以通過單擊葉節點來擴展樹。然後通過AJAX加載數據並更新樹。

問題在於,具有相同ID /名稱的對象可能會在樹中出現多次。有沒有辦法將JavaScript代碼中的所有重複節點(由於交叉鏈接將樹轉換爲圖形)乾淨地合併?

編輯:也許唯一的方法是沿着整棵樹走下去,重新鏈接所有指向重複的鏈接......雖然我認爲這可能會大大減慢腳本的速度。

+0

你有一個jsfiddle更好的可視化? – manu

+0

@manu:由於動態的AJAX調用很難複製......我不需要實際的代碼作爲答案,它更像是一個概念性問題:) –

+0

只是爲了理解:每個節點都有其唯一的ID嗎?在那之後,每個節點可以放置在多個父母之下? – manu

回答

0

我明白了......如何在所有可用的樹節點上保留一個附加列表?這樣你就不需要遞歸地遍歷層次結構。

+0

問題不是遍歷(我可以用'flatten()'函數得到所有節點的平坦列表),它是如何檢測重複並將它們鏈接在一起,同時(如果可能)保持基本的樹佈局。我認爲可以有一個乾淨的D3方式來做到這一點。 –