【问题标题】:rxjs5 - filtering array of objects by observable that each object containsrxjs5 - 通过每个对象包含的可观察对象过滤对象数组
【发布时间】:2016-03-01 08:35:37
【问题描述】:

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

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

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


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

【问题讨论】:

    标签: javascript typescript rxjs observable rxjs5


    【解决方案1】:

    您可以将数组中的每个项目 flatMap 到一个 Observable 流,该流将发出一个版本的项目,该版本将 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));
    

    【讨论】:

      【解决方案2】:

      在 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 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-23
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        相关资源
        最近更新 更多