RXJS5 - 按每个对象包含的可观察性过滤对象数组

rxjs5 - filtering array of objects by observable that each object contains

本文关键字:对象 可观察性 过滤 数组 包含 RXJS5      更新时间:2023-09-26

我有一个看起来像这样的数组

[
  {
    name: 'foo'
    filter: Observable.of(true)
  },
  {
    name: 'bar'
    filter: Observable.of(false)
  }
]

并且我只想返回其filter解析为 true 的项目,我将如何以最有效和反应性的方式执行此操作?我正在使用 rxjs5 beta2。


请注意,为了

简单起见,它是一个伪代码,在我的真实情况下,过滤器实际上是一个对象,它被传递给验证函数,该函数返回一个在truefalse中解析的可观察量。

可以将数组中的每个项平面映射到可观察流,该流将发出将Observable<bool>类型的 filter 属性替换为 bool 属性的项的版本。

const data$ = Rx.Observable.from(arr)
  // Convert each item's filter property to type bool
  .flatMap(x => x.filter.map(condition => Object.assign({}, x, { filter: condition })))
  // Now we can just filter over the filter property, which is of type bool.
  .filter(x => x.filter)
  // Each item emitted will have a filter value of true
  .subscribe(x => console.log(x));

RxJS 4 中有两件事使这变得简单:map 和 Rx.helpers.defaultComparer。 第一个映射分别发送可迭代对象的每个项目,默认比较器将为您进行深度检查。

var comparer = Rx.helpers.defaultComparer;
const Observable = Rx.Observable;
const arr = [
  {
    name: 'foo',
    filter: Observable.of(true)
  },
  {
    name: 'bar',
    filter: Observable.of(false)
  }
];
const data$ = Observable.from(arr)
  .map(each => each)
  .filter(each => comparer(each.filter, Observable.of(true)))
  .subscribe(x => console.log(x));
// prints Object {name: "foo", filter: FromArrayObservable} to my console

由于某种原因,这个默认比较器目前不在五个中。 也许帮助程序有一个新名称,因为它在 4 中没有被弃用,或者它还没有被迁移或不在 .helpers 中。