【问题标题】:How filter a json with observable rxJS如何使用可观察的 rxJS 过滤 json
【发布时间】:2018-09-16 17:09:37
【问题描述】:

我通过 Angular 服务 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));
  }

有人可以帮助我吗?

【问题讨论】:

标签: javascript angular rxjs


【解决方案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;
}

【讨论】:

  • 非常感谢您的帮助 :),我想使用 rxjx 来进行带有 obersable 的训练,但是使用递归 typescript 函数更简单
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 2017-07-01
  • 2018-11-23
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2019-03-29
相关资源
最近更新 更多