有没有结合map和filter的RX方法?
Is there an RX method which combines map and filter?
我是 RxJS 的新手。我知道我可以 .filter
和 .map
一个 observable 来获得我正在寻找的变化。但是,有没有什么方法可以将两者合二为一呢?
是的。
平面地图。
假设你有一个数字(1、2、3、4、5、...)的 Observable,你想过滤偶数并将它们映射到 x*10。
var tenTimesEvenNumbers = numbers.flatMap(function (x) {
if (x % 2 === 0) {
return Rx.Observable.just(x * 10);
} else {
return Rx.Observable.empty();
}
});
从rxjsv6.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)
);
以上将打印:
Value: 20
Value: 40
Value: 60
Value: 80
Value: 100
这也是一个有效的 stackblitz。
我是 RxJS 的新手。我知道我可以 .filter
和 .map
一个 observable 来获得我正在寻找的变化。但是,有没有什么方法可以将两者合二为一呢?
是的。
平面地图。
假设你有一个数字(1、2、3、4、5、...)的 Observable,你想过滤偶数并将它们映射到 x*10。
var tenTimesEvenNumbers = numbers.flatMap(function (x) {
if (x % 2 === 0) {
return Rx.Observable.just(x * 10);
} else {
return Rx.Observable.empty();
}
});
从rxjsv6.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)
);
以上将打印:
Value: 20 Value: 40 Value: 60 Value: 80 Value: 100
这也是一个有效的 stackblitz。