2016-09-11 2 views
0

Ich versuche, einen Baum mit dem Pfad für jeden Knoten zu machen:Javascript-Baum mit Pfad für jeden Knoten

Plunkr der aktuellen Demo (siehe Konsole nur): https://plnkr.co/edit/peCIZcSzChF3b2WnaOxk?p=preview

die ursprünglichen Daten: (dies ist eine Liste von Tags ist, die "Eltern" ist die ID Eltern)

var originals=[ 
    {"id":1,"name":"Grammaire","parent":null}, 
    {"id":2,"name":"Orthographe","parent":null}, 
    {"id":8,"name":"Orthographe lexicale","parent":2}, 
    {"id":9,"name":"Orthographe grammaticale","parent":2}, 
    {"id":10,"name":"Adjectif couleur","parent":9}, 
    {"id":11,"name":"Nombre","parent":8}, 
    {"id":12,"name":"Annalyse grammaticale","parent":1}, 
    {"id":19,"name":"Concordance des temps","parent":1}, 
    {"id":20,"name":"annalyse 2","parent":12} 
]; 

So sollte es einen Baum wie diese machen:

1-Grammaire 
    12-Annalyse grammaticale 
    20-Annalyse 2 
    19-Concordance des temps 
2-Orthographe 
    8-Orthographe lexicale 
    9-Orthographe grammaticale 
    10-Adjectif couleur 
    11-Nombre 

ich einen Code, der es machen:

function convert(array){ 
     var map = {}; 
     for(var i = 0; i < array.length; i++){ 
      var obj = array[i]; 
      obj["children"] = []; 
      map[obj.id] = obj; 
      var parent = obj.parent || '-'; 
      if(!map[parent]){ 
       map[parent] = { 
         children: [] 
       }; 
      }  
      map[parent].children.push(obj); 
     } 
     return map['-'].children; 
} 

Und das Ergebnis:

[ 
    {"id":1,"name":"Grammaire","parent":null, 
     "children":[ 
      {"id":12,"name":"Annalyse grammaticale","parent":1, 
       "children":[{"id":20,"name":"annalyse 2","parent":12,"children":[]}] 
      }, 
      {"id":19,"name":"Concordance des temps","parent":1,"children":[]} 
     ]}, 
    {"id":2,"name":"Orthographe","parent":null, 
     "children":[ 
      {"id":8,"name":"Orthographe lexicale","parent":2, 
       "children":[ 
        {"id":11,"name":"Nombre","parent":8,"children":[]}] 
      }, 
      {"id":9,"name":"Orthographe grammaticale","parent":2, 
       "children":[{"id":10,"name":"Adjectif couleur","parent":9,"children":[]}] 
      } 
     ] 
    } 
] 

PROBLEM!

zum Beispiel für den Knoten mit id = 20

{"id":20,"name":"annalyse 2","parent":12,"children":[]} 

Ich brauche für diesen Knoten des Elternknoten-ID und die Namen wie folgt zu erhalten:

{"id":20,"name":"annalyse 2","parent":12,"children":[] 
"parentNodes"= [{"id":1,"name":"Grammaire"},{"id":12,"name":"Annalyse grammaticale"},{"id":20,"name":"annalyse 2"}] 
} 

Ich will nicht zyklische Lösung, weil ich es bereits mache und meinen Code-Fehler mache, weil ich dieses Objekt klonen muss.

Jede Hilfe ist willkommen, weiß ich, dass ich eine rekursive Funktion machen müssen, die den „Weg“ hinzufügen, aber ich kann nicht bis jetzt dank

Antwort

0

vielleicht etwas repariert werden muss, aber die Arbeit!

function setPath(array){ 
     function initPath(node,liste){ 
      liste.push({"id":node.id,"name":node.name}); 
      node["path"] = tools_clone(liste) ; 
      for(var n in node.children){ 
       initPath(node.children[n],tools_clone(liste)); 
      } 
     } 

     for(var i = 0; i < array.length; i++) { 
      var p = []; 
      initPath(array[i],p); 
     } 
} 

var r = convert(originals); 
setPath(r); 
Verwandte Themen