rxjs过滤可观察的对象数组

时间:2018-06-13 18:45:45

标签: angular rxjs

我现在有了这段代码来过滤一个可观察的。

listings$: Observable<Listing[]>;

this.listings$ = this.firestore
      .getListings()
      .pipe(map(listings => listings.filter(listing => listing.promoted === true)));

哪种方法很好,但我想充分利用rxjs而不是在数组上使用filter

this.firestore.getListings()函数返回Observable<Listing[]>this.listings$也必须为Observable<Listing[]>

我尝试了不同的方法,并在此期间挣扎了一段时间。也许你可以帮助我。我还是#34;新鲜&#34;角度和rxjs。

this.listings$ = this.firestore.getListings().pipe(
      mergeMap(listings => listings),
      filter(listing => listing.promoted === true)
    );
  

类型Observable<Listing>不能分配给Observable<Listing[]>类型。

我可能在使用mergeMap运算符时出错了,或者在这种情况下使用它也不正确。

我尝试从this帖子调整代码。 flatMap运算符似乎已更改为mergeMap。但它仍然无效。

1 个答案:

答案 0 :(得分:0)

嗯,这取决于您希望如何使用this.listings$ Observable。使用mergeMap(listings => listings)是正确的,它会将Observable<Listing[]>变为Observable<Listing>,但您说要使用RxJS filter()运算符,并且您希望最后有Observable<Listing[]>

一种方法是使用take(1)toArray()运算符。 toArray()会将来自其来源的所有排放物累积到一个阵列中,当源竞争时,它会发出阵列。

this.listings$ = this.firestore.getListings().pipe(
  take(1),
  mergeMap(listings => listings),
  filter(listing => listing.promoted === true),
  toArray(),
);

请注意,此listings$ Observable只会发出一次,并且不会对来自this.firestore.getListings()的任何后续排放作出反应。

就个人而言,我实际上使用的是pipe(map(listings => listings.filter(...))),因为这样更容易使用。