我需要生成一个平面对象数组,其中包含平面归一化对象数组中给定对象的所有祖先。
存在许多将其变成嵌套树状结构的示例,但是我无法找到简单地以平面数组形式返回所有祖先的任何信息。平面归一化数组中的每个对象都有一个id和一个parentId。
给出对象的平面归一化数组
[
{
id: 1,
name: "node 1",
parentId: null,
}, {
id: 2,
name: "node 2",
parentId: 1,
}, {
id: 3,
name: "node 3",
parentId: null,
}, {
id: 4,
name: "node 4",
parentId: 3,
}, {
id: 5,
name: "node 5",
parentId: 2,
}, {
id: 6,
name: "node 6",
parentId: 1,
}, {
id: 7,
name: "node 7",
parentId: 6,
},
]
执行getAncestors(1)
时,它应返回节点1的所有祖先
[
{
id: 2,
name: "node 2",
parentId: 1,
}, {
id: 5,
name: "node 5",
parentId: 2,
}, {
id: 6,
name: "node 6",
parentId: 1,
}, {
id: 7,
name: "node 7",
parentId: 6,
},
]
我尝试过修改将其变成嵌套树状结构的功能,但是没有运气。
答案 0 :(得分:1)
要进行更快速的访问,您需要一个Map
,其中所有节点及其节点id
为键,以及所有以parentId
为键的父节点的映射。然后,您需要功能getAncestors
,在内部,您还需要一个功能来获得其祖先的点头。
用reduce组合在一起,然后返回结果。
function getAncestors(parentId) {
const getNode = node => [node, ...getAncestors(node.id)];
return (parents.get(parentId) || []).reduce((r, id) => [...r, ...getNode(nodes.get(id))], []);
}
var data = [{ id: 1, name: "node 1", parentId: null, }, { id: 2, name: "node 2", parentId: 1 }, { id: 3, name: "node 3", parentId: null }, { id: 4, name: "node 4", parentId: 3 }, { id: 5, name: "node 5", parentId: 2 }, { id: 6, name: "node 6", parentId: 1 }, { id: 7, name: "node 7", parentId: 6 }],
nodes = new Map(data.map(o => [o.id, o])),
parents = data.reduce((m, { id, parentId }) => m.set(parentId, [... (m.get(parentId) || []), id]), new Map);
console.log(getAncestors(1));
.as-console-wrapper { max-height: 100% !important; top: 0; }