2017-09-29 3 views
0

私はこれをできるだけ短くしておきます。d3ツリーのすべてのノードを取得

私はスニペットで木を表すJsonを持っています。 d3の助けを借りて、ルートのすべての子ノードを配列として取得しようとします。そのためには、関数 "nodes"を使用します。

問題は、私の子供のキーが「子供」の代わりに「_子ども」と呼ばれることです。私はノードの機能に "子供"の代わりに "子供"をチェックするように指示する良い解決策を見つけようとしています。すべての子供のキーの ""を削除すると動作します。

var json = {"_name":"root","_children":[{"_name":"Application","_children":[{"_name":"Application Heap","_children":[],"_color":"#0000ff", "MEMORY":20},{"_name":"Other","_children":[],"_color":"#000055","MEMORY":30},{"_name":"Statement Heap","_children":[],"_color":"","MEMORY":40}]}]}; 
 

 
console.log(json); 
 

 
// tell d3 that my children key is "_children" 
 
var treemap = d3.layout.treemap() 
 
    .children(function(d) { return d._children; }) 
 
    .value(function(d) { return d.MEMORY; }); 
 

 
// With this line I try to get all child nodes of the root element 
 
var nodes = treemap.nodes(json) 
 
    .filter(function(d) {return !d._children; }); 
 
    
 
console.log(json); // d3 sets the value and everything else correct 
 
console.log(nodes); // for some reason I get an empty array
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

答えて

0

一つの可能​​な解決策(ただし、私が欲しい1)は、最初にそのようなフィールドの再帰的な名前を変更することです:

var renameKeys=function(obj){ 
    if(obj._children){ 
     obj.children=obj._children; 
     delete obj._children; 
     obj.children.forEach(renameKeys); 
    } 
return obj; 
}; 
関連する問題