【问题标题】:How to filter an array with RxJS operator如何使用 RxJS 运算符过滤数组
【发布时间】:2018-06-16 14:43:21
【问题描述】:

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

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

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

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


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

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

【问题讨论】:

  • 你想从你的两个数组中发出所有的 {id : n} 对象吗?
  • 是的,我喜欢从两个数组中搜索 {id: n}。

标签: javascript arrays rxjs rxjs5


【解决方案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 方法不同。

【讨论】:

    【解决方案2】:

    有几个解决方案。简单的方法就是创建正确的 observable。

    • 您可以通过在 from: 的输入中连接数组来直接创建正确的 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}]));
      
    • 你也可以合并两个不同的 observable:

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

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

    【讨论】:

    • 是的,非常好。但是如果我从 API 接收并且已经是一个多数组呢? ?
    • 是数组的数组?如果是这样, flatMapping 应该可以工作。 subscription.flatMap(x => Rx.Observable.from(x))
    猜你喜欢
    • 2023-03-10
    • 2017-07-15
    • 1970-01-01
    • 2019-04-30
    • 2022-01-17
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多