javascript дърво с път за всеки възел

Опитвам се да направя дърво с пътя за всеки възел:

Plunkr на действителна демонстрация (вижте само конзолата): https://plnkr.co/edit/peCIZcSzChF3b2WnaOxk?p=preview

оригиналните данни: (това е списък с тагове, "родител" е родителският идентификатор)

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

ПРОБЛЕМ!

например за възела с id = 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"}]
}

Не искам циклично решение, защото вече го правя и правя грешка в кода си, защото трябва да клонирам този обект.

Всяка помощ е добре дошла, знам, че трябва да направя рекурсивна функция, която добавя „пътя“, но не успявам досега, благодаря


person AlainIb    schedule 11.09.2016    source източник


Отговори (1)


може би има нужда от някаква корекция, но работа!

 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);
person AlainIb    schedule 11.09.2016