2016-06-25 2 views
0

Ich versuche meine JSON-Daten so zu verschachteln, dass ich daraus leicht einen d3-Tree machen kann. Ich habe diesen Code bekam:D3 Nesting - inkonsistente Anzahl von Ebenen

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) } 

Das Problem, das ich habe, ist, dass nicht alle Einträge in meine Daten haben alle vier Kategorien zugeordnet. Einige von ihnen haben nur category1 und category2, also würde ich in einem solchen Fall nur zwei Knoten auf dem einen Link (auf dem Baumdiagramm) haben wollen. Aber was hier passiert, ist, dass alle Links eine vierstufige Struktur bekommen, auch wenn sie nicht alle Kategorien zugewiesen haben. Wenn ich ein Set mit nur zwei Kategorien (category1 und category2) habe, bekomme ich die Kategorie1 an der richtigen Stelle, die Kategorie2 endet am Ende, und zwei Ebenen von leeren Daten werden dazwischen erstellt.

Gibt es eine Möglichkeit, wie ich angeben könnte, was im Schachtelprozess ignoriert werden soll (in meinem Datensatz sind leere Kategorien mit "0" belegt)? Ich habe so etwas wie dies versucht:

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

Aber es ändert sich nur „0“ auf „undefiniert“ und nicht die Struktur verändern.

Oder vielleicht gibt es eine Möglichkeit, den d3-Code zu ändern, damit ich diese leeren Ebenen ignorieren werde? Ich bin neu in d3 und mein Code basiert vollständig auf dieses Beispiel: http://mbostock.github.io/d3/talk/20111018/tree.html

EDIT:

die Datenstruktur gegeben wie folgt aussehen:

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

}]; 

Ich möchte die d3 Baum schauen wie folgt aus:

 cat2a - johny 
     /  
    cat1 
     \ 
     cat2b - cat3 - cindy 

Und momentan bin immer ich dies:

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

Antwort

1

EDIT:

Sie können dies nicht mit d3.nest der Lage sein, zu erreichen(), aber Sie sollten die Kinder-Arrays für jedes Element über jede Kategorie durch Iteration und den Aufbau einer geeigneten Struktur aufbauen können. Hier ist ein 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();  

ich auch gefunden: http://learnjsdata.com/group_data.html hilfreich zu sein.

+0

Vielen Dank für die Antwort, leider ist das nicht ganz das, wonach ich bin. Ich habe meinen Beitrag bearbeitet, daher könnte es jetzt ein wenig klarer sein. – Xnn04

+0

Sicher, meine Antwort bearbeitet, um besser zu Ihrer Situation zu passen. Lassen Sie mich wissen, ob das hilft, wenn nicht, werde ich versuchen, eine Datei für die weitere Bearbeitung zusammenzustellen. –

+0

Also habe ich versucht, Ihren Code zu implementieren, stieß aber auf einige Probleme. Das Problem ist, dass es zwei viele Gruppen gibt (eine Menge von Knoten/Verknüpfungen, wenn Sie so wollen), die in dem Array gespeichert sind, das mit dieser Funktion erstellt wurde. Gleiche Eltern/Kindergruppen werden nur dort multipliziert. In diesem speziellen Beispiel kann ich das überwinden, indem ich die d3-Funktion wie folgt anrufe: d3MakeMeAtree (root.children [0] .children [0]), aber das ist kaum eine optimale Lösung, aber ich kann nicht herausfinden, wie ich deine Funktion ändern soll damit es richtig funktioniert. – Xnn04