从平面json生成(多级)flare.json数据格式

我有一个平的JSON文件结构,如:

[ { "name" : "ABC", "parent":"DEF", "relation": "ghi", "depth": 1 }, { "name" : "DEF", "parent":"null", "relation": "null", "depth": 0 }, { "name" : "new_name", "parent":"ABC", "relation": "rel", "depth": 2 } .... .... ] 

而我想要的是一个嵌套的文件结构,如:

 [ { "name": "DEF", "parent": "null", "relation": "null", "children": [ { "name": "ABC", "parent": "DEF", "relation": "ghi", "children": [ "name": "new_name", ... "children": [] ] } ] } ] 

它应该去多less层次没有限制。 目前我拥有的最大值是30.节点可以拥有的子节点数没有限制。 例如。 根节点的所有剩余部分作为子节点。

我到现在为止尝试过什么?

  • 阅读d3.nest()以及如何嵌套,但不完美。 https://groups.google.com/forum/?fromgroups=#!topic/d3-js/L3UeeUnNHO8/discussion

  • 为此写了一个python脚本,但是它被卡住了空值,也因为数据没有限制(每天增加两位数),所以它非常慢。

  • 我尝试了强制导向布局,它工作得很好,但我想添加另一个布局,使可视化变得简单。

  • 我可以和其他一些python脚本一起发布,但是它们似乎并没有传播除“name”和“children”之外的任何其他信息。

  • 我读了这个: http : //blog.pixelingene.com/2011/07/building-a-tree-diagram-in-d3-js/但他们也有正确的格式数据在首位。 我打算创build的是http://bl.ocks.org/mbostock/4339083 。

数据的来源是MS SQL Server数据库,我通过Python获取和parsing。 请帮助! 过去两周我一直坚持这一点。

谢谢

这里有一个实现,在Javascript中: http : //jsfiddle.net/9FqKS/

您首先创build一个名称为基础的地图,以便于查找。 有几种不同的方法可以做到这一点 – 在这种情况下,我使用了一个.reduce方法,它从一个空对象开始,迭代data数组,为每个节点添加一个条目:

 // create a {name: node} map var dataMap = data.reduce(function(map, node) { map[node.name] = node; return map; }, {}); 

这相当于:

 var dataMap = {}; data.forEach(function(node) { dataMap[node.name] = node; }); 

(我有时会认为reduce更优雅。)然后迭代地将每个子项添加到其父项,或者如果没有find父项,则将其添加到根数组中:

 // create the tree array var tree = []; data.forEach(function(node) { // find parent var parent = dataMap[node.parent]; if (parent) { // create child array if it doesn't exist (parent.children || (parent.children = [])) // add node to parent's child array .push(node); } else { // parent is null or missing tree.push(node); } }); 

除非你的树很大,否则我认为这不应该太昂贵,所以你应该能够在客户端做到这一点(如果你不能,你可能会有太多的数据,无论如何显示) 。