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