Для этого вы можете уменьшить ваш массив узлов до словаря, используя id
каждого узла в качестве индекса.
Таким образом, все узлы будут доступны по их идентификатору непосредственно в словаре.Таким образом, вы сможете легко хранить каждый узел в его родительском узле.
Как только все узлы сохранены в соответствующем родительском элементе, вам просто нужно извлечь корневой узел из словаря, он будет содержать все ваше дерево.
Может случиться, что родительский неОднако в словаре, когда вы анализируете дочерний объект, в этом случае вы можете использовать фиктивный объект, который будет воспроизводить заполнитель, когда мы приступим к анализу фактического родительского узла.
var arry = [
{"name": "a", "id": "2", "data":"foo", "parent": "1"},
{"name": "b", "id": "3", "data":"foo", "parent": "2"},
{"name": "c", "id": "4", "data":"foo", "parent": "3"},
{"name": "d", "id": "5", "data":"foo", "parent": "3"},
{"name": "e", "id": "6", "data":"foo", "parent": "4"},
{"name": "f", "id": "7", "data":"foo", "parent": "5"}
];
function totree(branches, node) {
// if we don't have the parent yet
if (!branches[node.parent]) {
// create a dummy placeholder for now
branches[node.parent] = {};
}
// store our node in its parent
branches[node.parent][node.id] = node;
// store our node in the full list
// copy all added branches on possible placeholder
branches[node.id] = Object.assign(node, branches[node.id]);
return branches;
}
var tree = arry.reduce(totree, {})['1']; // get only the root node ('1')
console.log(tree);