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

3

大家好,我是 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));

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

你想要从两个数组中发出所有的{id: n}对象吗? - Axnyff
是的,我喜欢从两个数组中搜索 {id: n}。 - erevos13
2个回答

4

如果你知道你总是有一个数组的数组,那么你可以将该数组展开,然后运行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方法那样迭代数组。

0

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

  • 您可以通过将输入中的数组连接起来直接创建正确的observable:

    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}]));
    
  • 您还可以合并两个不同的observables:

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

可能还有其他的解决方案可行,比如使用一个数组的数组,然后对该数组进行 flatMap 操作。


是的,那很好。但如果我从API接收到的数据已经是多维数组呢? - erevos13
这是一个数组的数组吗?如果是,那么 flatMapping 应该可以工作。subscription.flatMap(x => Rx.Observable.from(x)) - Axnyff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接