Essentially I want to build a new structure given an array of objects. The object payload would look like the array of elements below.
const data = [
{
path: [],
elements: ['Parent A']
},
{
path: ['Parent A'],
elements: ['Child A1', 'Child A2', 'Parent B']
},
{
path: ['Parent A', 'Parent B'],
elements: ['Child B1', 'Parent C']
},
{
path: ['Parent A', 'Parent B', 'Parent C'],
elements: ['Child C1']
},
{
path: ['Parent D'],
elements: ['Child D1']
},
]
The above payload would then get translated into the custom object that would look like this.
let newObject =
[
{
elem: "",
children: [
{
elem: "Parent A",
children: [
{
elem: "Child A1",
children: []
},
{
elem: "Child A2",
children: []
},
{
elem: "Parent B",
children: [
{
elem: "Child B1",
children: []
},
{
elem: "Parent C",
children: [
{
elem: "Child C1",
children: []
}
]
},
]
},
]
}
]
},
{
elem: "Parent D",
children: [
{
elem: "Child D1",
children: []
}
]
}
]
I've considered making a map where I've given each element a visited property (to avoid recreating an element) and doing a recursive approach to populate a potential parent. However, I'm currently stuck and looking for feedback on what data structure/approach I should use.
My code for the mapper
const stringifyPath = (arr) => {
return arr.join('>');
}
let elemMap = new Map();
data.forEach(item => {
const itemPath = stringifyPath(item.path);
if (!elemMap.get(itemPath)) {
elemMap.set(itemPath, {
elements: [],
visited: false
})
}
elemMap.get(itemPath).elements = [...elemMap.get(itemPath).elements, ...item.elements];
});
This yields
{
'' => { elements: [ 'Parent A' ], visited: false },
'Parent A' => { elements: [ 'Child A1', 'Child A2', 'Parent B' ],
visited: false },
'Parent A>Parent B' => { elements: [ 'Child B1', 'Parent C' ], visited: false },
'Parent A>Parent B>Parent C' => { elements: [ 'Child C1' ], visited: false },
'Parent D' => { elements: [ 'Child D1' ], visited: false } }
Any feedback is appreciated, thank you!