繁体   English   中英

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

[英]How filter a json with observable 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":[  

                  ]
               }

我想在我的观察对象上使用.filter来仅保留启用=== true的节点

我认为我需要创建一个递归函数或使用一个好的运算符rxjs

就目前而言,我成功过滤出了第一级

getTreeData(url:string) {
    return this.httpService.get(url).map(data => data.filter(data => data.enabled === true));
  }

有人可以帮助我吗?

这不是一个真正的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM