在管道中使用过滤器和映射来减少集合

时间:2019-06-13 23:41:07

标签: angular typescript rxjs

刚开始使用RxJS并尝试将我的头缠在filter上。 https://rxjs-dev.firebaseapp.com/api/operators/filter

从它的外观上,没有什么要弄清楚的,我知道吗? :S

这就是我所拥有的-

declare interface App {
  id: string;
  bId: string;
  account: string;
  title: string;
  platform: string;
  isLive: boolean;
}
public allApps: Observable<App[]>;

this.allApps = this.httpClient.get(`${UtilitiesService.APIRoot}/globals/apps`).pipe(
      map( response => response as App[] )
    );

get/pipe/map获取对象并将其正确投射到App[]数组中。到目前为止没有问题!

现在,我想filter退出bid !== null,并且在this.allApps中仅包含有效值。因此,我试图像这样将map的输出传递给filter-

this.allApps = this.httpClient.get(`${UtilitiesService.APIRoot}/globals/apps`).pipe(
      map( response => response as App[] ),
      filter( app => app.bid === null)
    );

就我的阅读资料/ YouTube视频而言,map(即App[])的输出将传递给filter方法。然后rxjs/filter会“自动”遍历每个项目吗?并清除空值。

但是filter以某种方式接收了App[],这迫使我在常规数组上使用常规过滤方法。 (不要试图花哨或类似的事情,而只是想了解rxjs/filter:D)

有人知道我如何使rxjs/filter工作吗?任何帮助是极大的赞赏。提前致谢!! :pray:

2 个答案:

答案 0 :(得分:3)

您似乎正在此处过滤掉“非空”值。

我相信您正在过滤从map方法返回的数组(过滤App []而不是每个应用)。可观察对象是一个“流”,因此您正在与地图操作员进行可观察对象的交互。

尝试将第二个过滤器更改为地图,例如:

map(apps => apps.filter(app => app.bid != null))

返回过滤的应用程序。

答案 1 :(得分:2)

您需要在谓词功能中处理响应,而不是处理一系列响应。

httpClient.get()返回Observable<App[]>而不是Observable<App>。这意味着mapfilter函数只能得到一个对象App[],因此filter函数和map函数一样只能得到一个数组对象。