Ragesh
Ragesh

Reputation: 215

Logic to convert Plain JSON Objects to Folder Like Structure

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

Answers (2)

Ragesh
Ragesh

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

Kristian Korsgaard
Kristian Korsgaard

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

Related Questions