Javascript 将关系数组转换为Typescript中的树对象

Javascript 将关系数组转换为Typescript中的树对象,javascript,arrays,tree,Javascript,Arrays,Tree,我有这样存储的对象数组中的结构数据库 array = [ {"name": "a", "id": "1", "parentId": NULL}, {"name": "b", "id": "2", "parentId": "1"}, {"name": "c", "id": "3", "parentId": "1"}, {"name": "d", "id": "4", "parentId": "1"}, {"name": "e", "id": "5", "parentId": "2"},

我有这样存储的对象数组中的结构数据库

array = [ {"name": "a", "id": "1",  "parentId": NULL},
 {"name": "b", "id": "2", "parentId": "1"},
 {"name": "c", "id": "3", "parentId": "1"},
 {"name": "d", "id": "4", "parentId": "1"},
 {"name": "e", "id": "5", "parentId": "2"},
 {"name": "f", "id": "6", "parentId": "3"},
 {"name": "g", "id": "7", "parentId": "3"},
 {"name": "h", "id": "8", "parentId": "4"},
 {"name": "j", "id": "9", "parentId": "4"}]

我想得到像这棵树一样的物体

{
    a: {
        b: {
            e: {}
        },
        c: {
            f: {},
            g: {}
        },
        d: {
            h: {},
            j: {}
        }
    }
}

可能的实施:

function grow(items) {
    var things = {"": {}};
    for (var i of items) {
        things[i.id] = {};
    }
    for (var i of items) {
        things[i.parentId || ""][i.name] = things[i.id];
    }
    return things[""];
}
如果保证父循环总是在其子循环之前,则可以合并这两个循环。

您可以使用递归:

buildTree(arr, root) {
  return {
    [root.name]: arr
      .filter(x => x.parentId === root.id)
      .map(x => buildTree(x))
      .reduce((a, b) => ({ ...a, ...b }), {}),
  };
}

const tree = buildTree(array, array.find(x => !x.parentId));

你可以绕一圈,也可以尊重父母

这种方法也适用于未排序的数据

var数组=[{name:“a”,id:“1”,parentId:null},{name:“b”,id:“2”,parentId:“1”},{name:“c”,id:“3”,parentId:“1”},{name:“d:“4”,parentId:“1”},{name:“e”,id:“5”,parentId:“2”},{name:“f”,id:“6”,parentId:“3”},{name:“g”,“id:“7”,parentId:“3”},{name:“h”,“id:“8”,parentId:“4”{name:“j”,id:“9”,父ID:“4”}],
树=函数(数据,根){
var o={};
data.forEach({name,id,parentId})=>{
o[id]=o[id]|{};
o[parentId]=o[parentId]|{};
o[parentId][name]=o[id];
});
返回o[root];
}(数组,空);
console.log(树);
。作为控制台包装{最大高度:100%!重要;顶部:0;}