rxjs5 - 通过每个对象包含的observable过滤对象数组

时间:2016-03-01 08:35:38

标签: javascript typescript rxjs observable rxjs5

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

filter

我想只返回true解析为真的项目,我该如何以最有效和最有效的方式做到这一点?我使用的是rxjs5 beta2。

请注意,为了简单起见,它是一个伪代码,在我的实例中,过滤器实际上是一个对象,它被传递给验证函数,该验证函数返回一个在false或{{1}中解析的observable }。

2 个答案:

答案 0 :(得分:1)

您可以将数组中的每个项目flatMap映射到一个Observable流,该流将发出一个项目版本,该项目替换filter类型Observable<bool>属性的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));

答案 1 :(得分:0)

RxJS 4中有两件事可以简化:map和Rx.helpers.defaultComparer。第一个map分别从iterable中发送每个项目,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

由于某种原因,此defaultComparer目前不在五。也许帮助器有一个新名称,因为它不会在4中被弃用,或者它可能尚未迁移或者不在.helpers。