0

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

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

我只想返回filter解析为真的项目,我将如何以最有效和最被动的方式做到这一点?我正在使用 rxjs5 beta2。


请注意,为了简单起见,它是一个伪代码,在我的真实案例中,过滤器实际上是一个对象,它被传递给一个验证函数,该函数返回一个解析为trueor的可观察对象false

4

2 回答 2

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));
于 2016-03-07T16:24:13.300 回答
0

RxJS 4 中有两件事使这变得简单:map 和 Rx.helpers.defaultComparer。first map 分别从可迭代中发送每个项目,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 中。

于 2016-03-01T15:54:53.457 回答