如何使用可观察的rxJS过滤json

时间:2018-04-06 15:57:29

标签: javascript angular rxjs

我得到了带有节点子节点的角度服务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));
  }
有人可以帮帮我吗?

1 个答案:

答案 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;
}