如何使用 observable 的输出来过滤另一个

Posted

技术标签:

【中文标题】如何使用 observable 的输出来过滤另一个【英文标题】:How to use the output of an observable to filter another 【发布时间】:2017-05-11 15:12:19 【问题描述】:

所以我有两个 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?>)
  );

也许答案很简单,但我想不通。

【问题讨论】:

【参考方案1】:

您需要加入这两个流,例如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);

【讨论】:

以防万一其他人遇到此解决方案:products$ 正在使用Observable.from -> 所以products不是是一个数组,而是一个对象,因此代码将因products.filter is not a function 而失败 Observable.from 接受 rxjs 5 中的数组。所以我认为代码可以工作。 啊,我明白你的意思了。如果需要,您可以将 toArray() 运算符放在中间以使其成为数组。 @DarkNeuron,是的,你可以。您也可以使用of 代替from。但在这两种情况下,你都会得到数组流。这可能是不可取的。

以上是关于如何使用 observable 的输出来过滤另一个的主要内容,如果未能解决你的问题,请参考以下文章

Python,如何添加另一个装饰器来过滤现有多装饰器的输出与python中的属性?

我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable

如何过滤 rxdart 中的 observable 列表

如何过滤 Observable 数组?

如何将第一个处理图像(例如 Canny 过滤器)的输出作为另一个处理过滤器的输入?

Angular 6:将 Observable 响应传递给另一个 Observable