Javascript 将普通JSON对象转换为类似文件夹的结构的逻辑

Javascript 将普通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: 'Document

我有这样的数据

[
  {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: {}
  }
}

实现上述结构转换的逻辑是什么?

找到了使用递归函数的逻辑

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

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

使用递归函数找到一个逻辑

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

谢谢你的帮助克里斯蒂安。。。我又发现了一个逻辑。。。我想你会喜欢的谢谢你的帮助克里斯蒂安。。。我又发现了一个逻辑。。。我想你也喜欢