我得到了带有节点子节点的角度服务HTTP和json。
{
"id":"CAT0001",
"parentId":null,
"label":"Internal Cause",
"level":1,
"enabled":true,
"children":[
{
"id":"CAT0003",
"parentId":"CAT0001",
"label":"Internal Deliberate Act",
"level":2,
"enabled":true,
"children":[ ]
},
{
"id":"CAT0004",
"parentId":"CAT0001",
"label":"Human Error",
"level":2,
"enabled":true,
"children":[
{
"id":"CAT0005",
"parentId":"CAT0004",
"label":"System input error",
"level":3,
"enabled":true,
"children":[
]
}
我想在我的observable上使用.filter,只保留启用的节点=== true
我认为我需要创建一个递归函数或使用一个好的运算符rxjs
目前我成功过滤了第一级
getTreeData(url:string) {
return this.httpService.get(url).map(data => data.filter(data => data.enabled === true));
}
有人可以帮帮我吗?
答案 0 :(得分:1)
这不是一个rxjs问题,因为它是您要过滤掉的结果对象的孩子。
我创建了这个stackblitz来帮助可视化问题 https://stackblitz.com/edit/recursive-tree?file=app/tree.service.ts
通过执行递归打字稿函数解决主要问题。
export interface TreeNode {
id: string;
parentId?: string;
label: string;
level: number;
enabled: boolean;
children: TreeNode[];
}
filterActiveNodes(nodes: TreeNode[]) {
const filteredNodes = nodes.filter(n => n.enabled);
// filter children
for (const n of filteredNodes) {
n.children = this.filterActiveNodes(n.children);
}
return filteredNodes;
}