如何使用observable的输出来过滤另一个
问题描述:
所以我有两个observable,一个返回当前类别和其他产品。我希望根据类别过滤产品。如何使用observable的输出来过滤另一个
这是角2,所以我真的希望我的NG2视图是用户(通过异步管道)。
像这样简单的例子:
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?>)
});
也许答案很简单,但它躲开我。
答
您需要加入这两个流,例如与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);
这样做的伎俩。 – DarkNeuron
为了防止有人遇到这个解决方案:'产品$'使用'Observable.from' - >所以'产品'将__not__是一个数组,但是一个对象,所以它的代码将会失败, products.filter不是一个函数' – olsn
Observable.from在rxjs中接受一个数组5.所以,代码将工作,我想。 – DarkNeuron