2016-06-25 51 views
0

我试图嵌套我的JSON数据,这样我就可以轻松地制作出一棵d3树。我有这样的代码:D3嵌套 - 级数不一致

d3.json("dbdata/getdata", function(error, data) { 


var nestedData = { 
    "key":"root", 
    "values": 
     d3.nest() 
      .key(function(d){return d.category1}) 
      .key(function(d){return d.category2}) 
      .key(function(d){return d.category3}) 
      .key(function(d){return d.category4}) 
      .entries(data) } 

我遇到的问题是,不是所有的在我的数据项都已经分配给它们的所有四个类别。其中一些只有category1和category2,所以在这种情况下,我希望在该链接上只有两个节点(在树形图上)。但是,这里发生的是,即使没有分配所有类别,所有链接都会获得四级结构。如果我有一个只有两个类别(category1和category2)的集合,我在正确的地方获得category1,类别2在最后得到,并且在它们之间创建两个级别的空数据。

有没有一种方法可以在嵌套过程中指定要忽略的内容(在我的数据集中,空分类被分配为“0”)? 我已经试过这样的事情:

.key(function(d){if(d.category2 !=="0")return d.category3}) 

但它只是改变了“0”到“不确定”,不改变结构。

或者也许有一种方法来更改D3代码,所以我会忽略这些空的级别?我是新来的D3和我的代码是完全根据这个例子:http://mbostock.github.io/d3/talk/20111018/tree.html

编辑:

由于数据结构看起来像这样:

elements = [ 
{name: 'johny', 
    category1: 'cat1', 
    category2: 'cat2a' 
}, 
{name: 'cindy', 
    category1: 'cat1', 
    category2: 'cat2b', 
    category3: 'cat3' 

}]; 

我想D3树看像这样:

 cat2a - johny 
     /  
    cat1 
     \ 
     cat2b - cat3 - cindy 

而且目前我得到这样的:

 cat2a - undefined - johny 
     /  
    cat1 
     \ 
     cat2b - cat3 - cindy 

回答

1

编辑:

您可能无法与d3.nest()来做到这一点,但你应该能够通过遍历每个元素的每个类别和建设儿童阵列构建一个合适的结构。 这里有一个的jsfiddle: https://jsfiddle.net/b1s65ydL/8/

var root, element, key, child, j, i, catHash; 
var categoryPropertyNames = [ 
    'category4', 
    'category3', 
    'category2', 
    'category1' 
]; //in descending order 
var nodeByName = Object.create(null); //dictionary to hold category nodes 

root = {name: 'root', children: []}; 
for (j = 0; j < elements.length; j++) { 
    element = elements[j]; 
    child = element; 
    for (i = 0; i < categoryPropertyNames.length; i++) { 
     key = categoryPropertyNames[i]; 
     if (!element.hasOwnProperty(key)) { 
      continue; 
     } 
     catHash = element[key] + '-' + key; 
     if (nodeByName[catHash] === undefined) { 
      nodeByName[catHash] = {name: element[key], children: []}; 
     } 
     var node = nodeByName[catHash]; 
     //add child to the array if is not already there 
     if (node.children.indexOf(child) == -1) { 
      node.children.push(child); 
     } 
     child = node; 
    } 
    //child is now either the first category, or the element itself 
    if (root.children.indexOf(child) == -1) { 
     root.children.push(child); 
    } 
}  

//d3 should be able to take it from here 
var nodes = tree.nodes(root).reverse();  

我还发现: http://learnjsdata.com/group_data.html是有帮助的。

+0

谢谢你的回应,不幸的是,这不是我所追求的。我编辑了我的帖子,所以现在可能会更清楚一些。 – Xnn04

+0

当然,编辑我的答案更好地适合你的情况。让我知道如果这有帮助,如果没有,我会尝试把一个jsfiddle进一步编辑。 –

+0

所以我试图实现你的代码,但遇到了一些问题。问题是存储在使用此函数创建的数组中的两个许多组(如果您愿意,则使用节点/链接集)。同样的父母/孩子群体在那里倍增。在这个特殊的例子中,我可以通过调用d3函数来解决这个问题:d3MakeMeAtree(root.children [0] .children [0]),但这并不是最佳解决方案,但我无法弄清楚如何改变你的函数使其正常工作。 – Xnn04