Логика для преобразования простых объектов JSON в структуру, подобную папке

#javascript #node.js #json

#javascript #node.js #json

Вопрос:

У меня есть такие данные

 [
  {name: 'SubFolder1', parent: 'Folder1'},
  {name: 'SubFolder2', parent: 'SubFolder1'},
  {name: 'SubFolder3', parent: 'SubFolder2'},
  {name: 'Document1', parent: 'Folder1'},
  {name: 'Document2', parent: 'SubFolder1'},
  {name: 'Document3', parent: 'SubFolder2'},
]
  

Я хочу преобразовать это в

 {
  Folder1: {
    SubFolder1: {
      SubFolder2: {
        SubFolder3: {},
        Document3: {}
      },
      Document2: {}
    },
    Document1: {}
  }
}
  

Какова логика для реализации приведенного выше преобразования структуры?

Ответ №1:

 // 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);

  

Комментарии:

1. Спасибо за вашу помощь, Кристиан… Я нашел еще одну логику… Я думаю, вам это тоже нравится

Ответ №2:

Найдена логика, использующая рекурсивную функцию

 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"));