首页 > 解决方案 > 按可观察属性的值过滤可观察数组?

问题描述

我有一个符合以下条件的排放流:Observable<Notice[]>. 每个Notice都有一个属性isVisible$( Observable<boolean>),它决定了它是否在这个特定的时刻出现在屏幕上。我想通过最近的值是否是来过滤这组isVisible$通知true。当出现新array的通知时,我想再次开始该过程。我知道这需要switchMap在更高阶的可观察流上使用。

两种类型的 observable 都不会完成,因此使用 like 运算符toArray()在这里不起作用。每个isVisible$流都保证至少发出一次。

我希望输出也是 of Observable<Notice[]>,每次isVisible$任何内部可观察谓词的流更新时都会发出。

到目前为止,我确实发出了正确的值,但内部管道只是将通知组合在一起并发出它们(通过scan,代替toArray),它不会缓冲到 的长度from(notices)然后发出(如果这有意义的话)这使得流的最终结果是太忙了。

notices.pipe(
  switchMap(notices => from(notices).pipe(
    mergeMap(notice => notice.isVisible$.pipe(
      map(isVisible => ({ notice, isVisible }))
    )),
    filter(({ isVisible }) => isVisible),
    map(({ notice }) => notice),
    scan((noticesArr, noticeBeingAddedOrRemoved) => {
      if (!noticesArr.find(n => n.identifier === noticeBeingAddedOrRemoved.id)) {
        noticesArr.push(noticeBeingAddedOrRemoved);
      }
      return noticesArr;
    }, [])
  ))
);

这是我在 StackBlitz 上使用的可重现示例

标签: rxjs

解决方案


我已将其更改为使用 zip,它只会在每个 isVisible$ observables 发出时才会发出。combineLatest如果您想在任何源 observables 发出时发出,也可以使用,而不是等待所有这些。


推荐阅读