дерево 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