是否有一种结合了地图和过滤器的RX方法?

Bry*_*ner 10 rxjs

我是RxJS的新手.我知道我可以.filter.map一个观察到我正在寻找的改变.但是,有没有任何方法将两者合二为一?

And*_*ltz 25

就在这里.

FlatMap.

假设您有一个Observable数字(1,2,3,4,5,...),并且您希望过滤偶数并将它们映射到x*10.

var tenTimesEvenNumbers = numbers.flatMap(function (x) {
  if (x % 2 === 0) {
    return Rx.Observable.just(x * 10);
  } else {
    return Rx.Observable.empty();
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是在这个例子中,过滤操作必须在“ if”语句的括号内完成。假设您有一个通用的过滤器函数要多次应用于该操作,您仍然可以执行此操作,但是您要编写多个if()语句。此外,您需要每次都调用它。有了一个解决方案,您可以将filter和map函数作为单独的参数传递,这要干净得多。在我看来,支持这种编码风格的解决方案更具“功能性”。 (2认同)
  • `flatMap` 现在是 `mergeMap`:https://github.com/ReactiveX/RxJS/issues/333 (2认同)

Mic*_*ael 7

从rxjs v6.6.7开始,解决方案变成如下:

    // Initialise observable with some numbers
    const numbers = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    // Pipe the observable using mergeMap
    const tenTimesEvenNumbers = numbers.pipe(
      mergeMap((x: number) => {
        // If the number is even, return an observable containing the number multiplied by ten
        // Otherwise return an empty observable
        return x % 2 === 0 ? of(x * 10) : EMPTY;
      })
    );

    // Subscribe to the observable and print the values
    tenTimesEvenNumbers.subscribe((value: number) =>
      console.log('Value:', value)
    );
Run Code Online (Sandbox Code Playgroud)

上面将打印:

Value: 20
Value: 40
Value: 60
Value: 80
Value: 100
Run Code Online (Sandbox Code Playgroud)

这也是一个正在运行的stackblitz