2016-12-27 12 views
3

2つのオブザーバブルがあり、現在のカテゴリと他の製品が返されます。カテゴリに基づいて製品をフィルタリングしたいと思います。observableの出力を使って別のフィルタをフィルタリングする方法

これはAngular 2であるため、実際にng2-viewを(非同期パイプ経由で)サブスクライバにしたいと考えています。この単純な例のように

何か:

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return products$ 
    .toArray() 
    .filter(prod => { 
    return prod.cat_id.some(id => id === <how do I get the value of the category observable here?>) 
    }); 

たぶん、答えは簡単ですが、それは私を見逃さ。

答えて

5

これらの2つのストリームを結合する必要があります。 combineLatestと:

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return Observable.combineLatest(products$, category$) 
    .map(([products, category]) => { 
    return products.filter(prod => prod.cat_id.some(id => id === category.id); 
    }); 

更新

@olsnがObservable.fromで指摘したように、あなたは、イベントではないイベントの配列のストリームのストリームを取得します。したがって、解決策は次のようにする必要があります。

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return Observable.combineLatest(products$, category$) 
    .filter(([product, category]) => { 
    return product.cat_id.some(id => id === category.id); 
    }) 
    .map(([product, category]) => product); 
+0

これはトリックでした。 – DarkNeuron

+1

'products $'は 'Observable.from'を使用しています - >' products'は配列ですが単一のオブジェクトなので、そのままのコードは ' products.filterは関数 ' – olsn

+0

ではありません。Observable.fromはrxjs 5の配列を受け入れます。コードがうまくいくと思います。 – DarkNeuron

関連する問題