具有创建层次结构的功能,但需要一种有效的方法来构建它,同时删除不需要的节点并将其子节点提升为有效的父节点。
注意:父节点将始终显示在数组中的子节点之前。
Node { id: string, parentNodeId: string, flag: boolean, children: Node[] };
function buildTree(nodes) {
var tree;
var childrenOf = new Map();
nodes.forEach(node => {
if (!childrenOf.has(node.id)) {
childrenOf.set(node.id, []);
}
node.childNodes = childrenOf.get(node.id);
if (node.parentId != null) {
childrenOf.has(node.parentId) ?
childrenOf.get(node.parentId).push(node) : childrenOf.set(node.parentId, [node]);
} else {
tree = node;
}
});
return tree;
}
当标志为真时删除节点,在jsfiddle json中,需要删除node.id 1和2,同时将3作为子节点提升到节点0.当标志为真时,上面的函数不会删除,它只是构建层次结构。
小提琴中示例的预期输出:
{
"id":"0",
"parentId":null,
"children":null,
"flag":"false",
"childNodes":[
{
"id":"3",
"parentId":"2",
"children":null,
"flag":"false",
"childNodes":[
{
"id":"4",
"parentId":"3",
"children":null,
"flag":"false",
"childNodes":[
]
},
{
"id":"5",
"parentId":"3",
"children":null,
"flag":"false",
"childNodes":[
]
}
]
},
{
"id":"6",
"parentId":"0",
"children":null,
"flag":"false",
"childNodes":[
]
}
]
}
答案 0 :(得分:0)
这是基于递归调用的javascript方法(无限深度的“育儿”),它可以很容易地应用于打字稿项目:
const buildTreeHierarchy = (nodes, perentId) => {
const result = nodes
.filter(n => n.parentId === perentId && n.flag !== 'true')
.map(n => ({...n, children: buildTreeHierarchy(nodes, n.id)}));
return result.length ? result : null;
}
buildTreeHierarchy(example, null);
example
参数是您的初始JSON数组。