如何使用 RxJS 运算符过滤数组

How to filter an array with RxJS operator

大家好,我是 RxJs 和响应式编程的新手,我想像这样过滤一个数组:

let subscription = Rx.Observable.from([{id: 1}, {id: 2}, {id: 3}],[{id: 4}, {id: 5}, {id: 6}]);

如果我有一个数组 a 我可以这样做:

let subscription = Rx.Observable.from([{id: 1}, {id: 2}, {id: 3}]);


subscription.filter(x => x.id === 1).subscribe(x => console.log(x));

但是我该如何处理第二个数组?

有几个解决方案。简单的方法就是创建正确的可观察对象。

  • 您可以通过在您的输入中连接数组来直接创建正确的可观察对象 from:

    let subscription = Rx.Observable.from([{id: 1}, {id: 3}].concat([{id: 1}]));
    
  • 你可以使用 Rx.Observable.of 直接接受与创建的 Observable 中的值一样多的参数并使用扩展运算符:

    let subscription = Rx.Observable.of(...[{id: 1}, {id: 3}].concat(...[{id: 1}]));
    
  • 您还可以合并两个不同的可观察对象:

    let subscription = Rx.Observable.from([{id: 1}
                          .merge(Rx.Observable.from([{ id: 1}]);
    

可能还有其他解决方案可以工作,例如使用数组的数组,然后对该数组进行平面映射。

如果你知道你总是有数组数组你可以展平数组然后 运行 filter:

const o = Rx.Observable.of([{id: 1}, {id: 2}, {id: 3}],[{id: 1}, {id: 2}, {id: 3}])
  .concatMap(array => array) // flatten the array into single emissions
  .filter(x => x.id === 1)
  .subscribe(x => console.log(x));

我正在使用接受多个参数的 .of。但是它需要它们,因为它们不同于迭代数组的 from 方法。