我在这样存储的对象数组中有结构数据库;
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: {}
}
}
}
答案 0 :(得分:1)
您可以使用递归:
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));
答案 1 :(得分:0)
可能的实现:
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[""];
}
如果可以保证父级始终位于其子级之前,则可以合并两个循环。
答案 2 :(得分:0)
您可以在此处简单地使用Array.reduce()
来构建树。这里的主要思想是维护所有键的flatMap
并将其引用推入树中,以便在平面图中的子节点或子子节点中所做的更改反映在主树中。它可以用于任何数量的级别,也可以用于无序数组。
请尝试以下操作:
let 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"}, {"name": "k", "id": "10", "parentId": "9"}, {"name": "l", "id": "11", "parentId": "10"}, {"name": "m", "id": "12", "parentId": "9"}];
let idToNameMap = array.reduce((a, {name, id}) => (a[id] = name, a), {});
let flatMap = {};
let result = array.reduce((acc, curr)=>{
if(!curr.parentId)
return acc;
let key = idToNameMap[curr.parentId];
if(!flatMap[key]){
flatMap[key] = {};
acc[key] = flatMap[key];
}
let node = flatMap[key];
flatMap[idToNameMap[curr.id]] = {};
node[idToNameMap[curr.id]] = flatMap[idToNameMap[curr.id]];
return acc;
},{});
console.log(result);
答案 3 :(得分:0)
您可以进行一次循环,并尊重父母。
这种方法也适用于未排序的数据。
var 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" }],
tree = function (data, root) {
var o = {};
data.forEach(({ name, id, parentId }) => {
o[id] = o[id] || {};
o[parentId] = o[parentId] || {};
o[parentId][name] = o[id];
});
return o[root];
}(array, null);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }