簡體   English   中英

rxjs5-通過觀察每個對象包含的對象來過濾對象數組

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

我有一個看起來像這樣的數組

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

並且我只想返回filter為真的項目,我該如何以最有效和反應最快的方式來做呢? 我正在使用rxjs5 beta2。


請注意,為簡單起見,它是一個偽代碼,在我的實際情況下,過濾器實際上是一個對象,該對象傳遞給驗證函數,該函數返回一個可分辨為truefalse的observable。

您可以將數組中的每個項目平面映射到一個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));

RxJS 4中有兩件事使此操作變得容易:map和Rx.helpers.defaultComparer。 第一個地圖分別從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目前不在五分之內。 也許為helper改了個新名稱,因為它沒有在4中被棄用,或者可能尚未遷移或不在.helpers上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM