2012-08-13 3 views
7

Ich bin mir sicher, dass es eine wirklich einfache elegante Möglichkeit gibt, dies zu tun, aber ich kann es nicht genau herausfinden. Ich habe einige Eingabedaten, die wie folgt aussieht:D3: Verwenden Sie die Verschachtelungsfunktion, um flache Daten mit dem Elternschlüssel in eine Hierarchie zu verwandeln.

[ 
{id: 1, name: "Peter"}, 
{id: 2, name: "Paul", manager: 1}, 
{id: 3, name: "Mary", manager: 1}, 
{id: 4, name: "John", manager: 2}, 
{id: 5, name: "Jane", manager: 2} 
] 

Wenn möglich, möchte ich die d3.js Nest Operator verwenden, um eine Struktur zu erhalten, in der Hierarchie Layout zu verwenden. Wie folgt aus:

[ 
    {name: "Peter", children: [ 
      {name:"Paul", children: [ 
       {name:"John"}, 
       {name:"Jane"} 
      ]}, 
      {name:"Mary"} 
     ] 
    } 
] 

Antwort

12

Sie können das Nest Operator hier verwenden, da nisten eine feste Hierarchie erzeugt: die Anzahl der Ebenen in der Ausgabehierarchie ist die gleiche wie die Anzahl von Schlüsselfunktionen, die Sie angeben.

Das heißt, Sie können Ihre eigene Funktion schreiben, die einen Baum erzeugt. Unter der Annahme, dass der Stammknoten der erste Knoten im Eingabearray ist, können Sie eine Zuordnung von ID zu Knoten erstellen und dann den Baum träge erstellen.

function tree(nodes) { 
    var nodeById = {}; 

    // Index the nodes by id, in case they come out of order. 
    nodes.forEach(function(d) { 
    nodeById[d.id] = d; 
    }); 

    // Lazily compute children. 
    nodes.forEach(function(d) { 
    if ("manager" in d) { 
     var manager = nodeById[d.manager]; 
     if (manager.children) manager.children.push(d); 
     else manager.children = [d]; 
    } 
    }); 

    return nodes[0]; 
} 

Wenn Sie wissen, dass die Knoten in Reihenfolge aufgeführt sind, so dass Manager vor ihren Berichten angezeigt werden, können Sie den Code vereinfachen nur einmal zu durchlaufen.

+1

Vielen Dank, das war sehr hilfreich. Ich habe tatsächlich damit begonnen, am Anfang des Baumes zu beginnen, indem ich (1) eine Suche basierend auf dem Manager (Wörterbuch von Arrays), (2) beginnend mit einer bekannten Wurzel erzeuge und die Kinder rekursiv zu jedem Bericht hinzufüge. – prauchfuss