2017-11-29 5 views
2

私は継承したJavaScriptコードをいくつか持っています。 jsonデータに基づいて階層ツリーを描画します(D3バージョン3ライブラリを使用)。コードは機能します。私は軽微な変更を加える必要がありますが、修正を行う方法は問題です。私はtreeDataというオブジェクトを持っています。 treeDataは、ツリー内のノードの階層リストです。各ノードには、名前、ID、深さ、x、y、子などのプロパティがあります。 Childrenは現在のノードの子ノードを指す配列です。だから子供たちは子供を持つことができ、子供を持つことができます。私がtreeDataオブジェクトを見ると、私は 'ルート'ノードを見るので、それは10人の子供がいることがわかります。Javascript - Traversing配列のヒラリーオブジェクト

enter image description here

子配列は、構造的に親と同じです...これは最初の子を拡大示しており、私はそれは3人の子供を持っていることがわかります。私のデータは通常3〜4レベルの深さです。 enter image description here

私の課題は、ツリー内のすべてのノードに対して機能を実行する必要があることです。 、

var myNode; 
for (var zz = 0; zz <= treeData.children.length; zz++) { 
myNode = treeData.children[zz]; 
collapseNode(myNode); 
} 

問題は、これはただ1つのレベルで見えるということです。私のようなものを必要とする...私はこれを行うためのエレガントな方法があることを確信しているが、私はそれは何でしょうかわかりません階層をトラバースしない...階層内の各ノードを訪問するためにこれを書き直すにはどうすればよいですか?

+1

をあなたはそれを行うには、再帰関数が必要です。あなたは実際に何をしたいですか? –

+1

これが役に立ちます - https://stackoverflow.com/questions/722668/traverse-all-the-nodes-of-a-json-object-tree-with-javascript –

+0

@Manish - 最終結果...階層内の各オブジェクトは、collapseNode(現在のノード)を呼び出します。 – user1009073

答えて

1

この再帰的なアプローチを試してみて、これを試してみてください -

function traverse(o) { 
    for (i in o) { 
     // if o is an object, traverse it again 
     if (!!o[i] && typeof(o[i])=="object") { 
      console.log(i, o[i]) 
      traverse(o[i]); 
     } 
    } 
} 
0
function traverse(array){ 
    for(const obj of array){ 
    //do whatever with obj, than go deeper 
    traverse(obj.children); 
    } 
} 

再帰的に深く進むと非常に簡単です。

0

function processNode(node) 
{ 
    collapseNode(myNode); //logic for current node 
    (treeData.children || []).forEach(function(chidNode){ 
     processNode(chidNode); //if there are children invoke the same method for each child node 
    }); 
} 
processNode(treeData); //invoke for your treeData 
+0

私は行を得ることができません...(treeData.children || [])。forEach(function(chidNode){...これは、現在のノードと子ノードの1つだけを呼び出すように見えます。 – user1009073

+0

@ user1009073これをテストするために、私は 'treeData'のサンプルデータをいくつか共有できますか? – gurvinder372