2016-03-01 17 views
0

我有一個數組,看起來像這樣rxjs5 - 通過觀察到的過濾對象的數組,每個對象都包含

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

,我只想返回的項目,其filter解決了的話,我會怎麼做,在最有效且被動的方式?我正在使用rxjs5 beta2。


注意,它是簡單起見僞代碼,在我的真實案例過濾器實際上是一個對象,傳遞給一個驗證函數,它返回一個可觀察到的是,在truefalse解決。

回答

1

您可以將陣列中的每個項目平面映射到Observable流,該流將會發射一個filter屬性的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)); 
0

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目前不在五。也許有一個新的助手名稱,因爲它不被認爲在4中被棄用,或者它可能還沒有被遷移或者不在.helpers。

相關問題