Reputation: 215
I have a data like this
[
{name: 'SubFolder1', parent: 'Folder1'},
{name: 'SubFolder2', parent: 'SubFolder1'},
{name: 'SubFolder3', parent: 'SubFolder2'},
{name: 'Document1', parent: 'Folder1'},
{name: 'Document2', parent: 'SubFolder1'},
{name: 'Document3', parent: 'SubFolder2'},
]
I want to convert this into
{
Folder1: {
SubFolder1: {
SubFolder2: {
SubFolder3: {},
Document3: {}
},
Document2: {}
},
Document1: {}
}
}
What is the logic to implement the above structure conversion?
Upvotes: 0
Views: 35
Reputation: 215
Found a logic using Recursive function
let data = [
{name: 'SubFolder1', parent: 'Folder1'},
{name: 'SubFolder2', parent: 'SubFolder1'},
{name: 'SubFolder3', parent: 'SubFolder2'},
{name: 'Document1', parent: 'Folder1'},
{name: 'Document2', parent: 'SubFolder1'},
{name: 'Document3', parent: 'SubFolder2'},
];
function getDescendats(name) {
let obj = {};
data.map((temp) => {
if (temp.parent === name) {
obj[temp.name] = getDescendats(temp.name);
}
});
return obj;
}
console.log(getDescendats("Folder1"));
Upvotes: 1
Reputation: 11
// Original list
const list = [
{name: 'SubFolder1', parent: 'Folder1'},
{name: 'SubFolder2', parent: 'SubFolder1'},
{name: 'SubFolder3', parent: 'SubFolder2'},
{name: 'Document1', parent: 'Folder1'},
{name: 'Document2', parent: 'SubFolder1'},
{name: 'Document3', parent: 'SubFolder2'},
];
// Get all items
const items = list.map(i=>i.name);
// Get all unique parents
const parents = list.map(i=>i.parent).filter((val,idx,self)=>self.indexOf(val)===idx);
// Get all parents that are not listed in items
const parents_not_in_items = parents.filter(p=>items.indexOf(p)===-1);
// Create the directory object
const directory = {};
// Create a recursive function to populate this directory
const populate = function(parent)
{
let children = {};
list.filter(i=>i.parent===parent).map(i=>i.name).forEach(i=>children[i] = populate(i));
return children;
};
// Finally populate the directory
parents_not_in_items.forEach(p=>directory[p] = populate(p));
// Print the directory, or do something with it
console.log(directory);
Upvotes: 1