function createTree(arr, structure) {
const tree = Object.fromEntries(arr.map(n => [ n.id, { ...n } ]));
const nonRootIds = structure.flatMap(n => n.children);
structure.forEach(n => tree[n.id].elements = n.children.map(m => tree[m]));
return Object.values(tree).filter(n => !nonRootIds.includes(n.id));
}
я так думаю, что конечно же веб
array.reduceRight((acc, n) => ({ ...n, children: [ ...n.children, acc ] }), { ...obj })
const getById = id => data.filter(s => s.structureId === id)[0] || false;
const getChild = me => data.filter(s => s.parentId === me.structureId)[0] || false;
const getMyParent = me => getById(me.parentId);
const getParentsChain = me => {
const chain = [];
let parent = getMyParent(me);
while(parent) {
chain.unshift(parent);
parent = getMyParent(parent);
}
return chain;
}
const getChildrenChain = me => {
const chain = [];
let child = getChild(me);
while(child) {
chain.push(child);
child = getChild(child);
}
return chain;
}
// test
const me = getById(3);
console.log([...getParentsChain(me), me, ...getChildrenChain(me)]); /*
0: Object { name: "Дирекция юкрк", parentId: null, structureId: 1 }
1: Object { name: "Южно-Курильск", parentId: 1, structureId: 2 }
2: Object { name: "Служба главного инженера", parentId: 2, structureId: 3 }
3: Object { name: "Мехцех", parentId: 3, structureId: 4 } */