RxJS:过滤数组中的元素数组

时间:2017-06-22 17:51:12

标签: arrays typescript rxjs reactive-programming

好的,我尝试了flatMapfilter和各种RxJS运算符的多种组合和排列,但我似乎无法解决我的问题。

我在TypeScript中有一个ITag接口,其中包含一个属性selectable。我有一个Observable这些ITags的数组,我想生成另一个Observable数组ITags,其中selectable属性为true

这是一些假代码,它是大约三个小时的高潮。头疼:

protected getCategories(): Observable<ITag[]> {
  return this.getModule()
    .flatMap((module) => Observable.from(module.descendants))
    .filter((descendant) => descendant.selectable);
}

此处,this.getModule()返回Observable<ITag>module.descendantsArray<ITag>。编译器当前抱怨:

  

键入&#39; Observable&lt; ITAG&GT;&#39;不能分配给类型&#39; Observable&lt; ITag []&gt;&#39;。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

从方法的签名来判断你想要什么可能更符合这一点。

protected getCategories(): Observable<ITag[]> {
  return this.getModule()
    .reduce((acc, descendant) => { acc.push(descendant); return acc; }, [])
    .map((descendants) => descendants.filter(d => d.selectable));
}

这样,您将获得一个包含ITag列表作为值的事件。您可以阅读有关reduce运算符here的更多信息。

你的代码很好,只是它产生了ITag的Observable,而不是ITag的数组。因此,您将分别为每个ITag获得一个活动。

如果这就是您想要的,您只需更改方法的返回类型即可。你得到那个错误是因为你要返回 Observable&lt; ITag&gt; 当函数定义表明它应该是 Observable&lt; ITag []&gt;

protected getCategories(): Observable<ITag> {
  return this.getModule()
    .flatMap((module) => Observable.from(module.descendants))
    .filter((descendant) => descendant.selectable);
}