2013-01-24 30 views
2

我有一个JSON文件看起来像这样:D3节点和链路从JSON儿童的嵌套数组

{ 
    Object: { 
     children: Array[4] 
     ... 
    Object: { 
     children: Array[1] 
      Object: { 
       children: Array[3] 
       ... 
      }, 
      Object: { 
       children: Array[1] 
       ... 
      }, 
     ... 
    } 
    ... 
} 

该数组是一帮具有包含儿童阵列儿童的数组对象要深入几层。

我的问题是,当我尝试将它变成一组节点和链接以用于d3强制布局时,我无法正确显示它。我尝试使用array.map或forEach递归遍历所有对象并自己创建链接,但这似乎过于繁琐。

是否有一种更简单的方式来获取准备在强制布局中显示的数据?我错过了什么?

回答

2

我找到了一个有我需要的代码的例子。该功能可以平滑数据。它在Coffeescript中,因为这就是我使用的。

flatten: (root) => 
    nodes = [] 
    i = 0 
    recurse = (node) => 
     if node.children 
      node.size = node.children.reduce(
       (p, v) -> p + recurse(v) 
      , 0) 
     if !node.id 
      node.id = ++i 
     nodes.push(node) 
     node.size 
    root.size = recurse(root) 
    nodes 

我这样做,我可以只运行tree.layout()。链接()生成的链接,而无需做手工。

@nodes = @flatten(@root) 
@links = d3.layout.tree().links(@nodes) 

希望能够帮助某人,因为这没有记录在文档或wiki中。

2

您可能想要使用Reingold-Tilford tree in D3.js,而不是强制布局。这样,您的数据已经以正确的格式显示,并且布局也可能更好。

如果您确实想要使用真正的强制定向布局,那么您将不得不将数据重写为D3所期望的nodeslinks格式。无论如何,这是网络图的标准逻辑结构。

1

JavaScript函数是:

function flatten(root) {  
var nodes = [], i = 0; 

function recurse(node) { 
    if (node.children) 
     node.size = node.children.reduce(function(p, v) { return p + recurse(v); }, 0); 
    if (!node.id) 
     node.id = ++i; 
    nodes.push(node); 
    return node.size; 
} 

root.size = recurse(root); 
return nodes; 
}