2016-09-11 4 views
0

я пытаюсь сделать дерево с путем для каждого узла:Javascript дерева пути для каждого узла

Plunkr фактического демо (см только консоль): https://plnkr.co/edit/peCIZcSzChF3b2WnaOxk?p=preview

оригинальных Данные: (это список тегов, «родительский» является родительским ID)

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} 
]; 

Так оно и должно сделать дерево, как это:

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 

я получить код, который сделает это:

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

И результат:

[ 
    {"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":[]}] 
      } 
     ] 
    } 
] 

ПРОБЛЕМА!

, например, для узла с идентификатором = 20

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

Мне нужно для этого узла идентификатор родительского узла и имя, как это:

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

Я не хочу потому что я уже делаю это и делаю свой код, потому что мне нужно клонировать этот объект.

Любая помощь приветствуется, я знаю, что я должен сделать рекурсивную функцию, кто добавить «путь», но я не обязательно до сих пор благодаря

ответ

0

возможно нужно некоторое исправление, но работает!

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); 
Смежные вопросы