对象数组上的Angular RxJS可观察过滤器

时间:2018-09-10 18:16:38

标签: angular rxjs observable

我是Angular和Observable的新手。我想对对象数组应用过滤器。这就是我的代码的样子。 。

getReport()获取所有报告。

 getReports(): Observable<IReport[]>  {
    console.log("in get Reports Service Call");
    return this._http.get<IReport[]>(this.URL)
      .pipe(
        tap(data => console.log('All Data Retrieved - ' + JSON.stringify(data))),
        catchError(this.handleError));
  }

我正在尝试编写另一种方法,该方法可以根据报告名称进行过滤,并为我提供IReport数组。这就是我现在所拥有的。

 getReportDetails(name : string) : Observable<IReport[]>
  {
    return this.getReports().pipe(
      map((reports : IReport[]) => reports.find(p => p.reportName === name))
    );
  }

我收到错误消息

Type 'Observable<IReport>' is not assignable to type 'Observable<IReport[]>'.

这是具有5个属性的IReport接口。

export interface IReport {
    date: Date;
    reportName: string;
    reportLink: string;
    reportStatus: string;
    region: string;
  }

我在做什么错?谢谢大家

3 个答案:

答案 0 :(得分:4)

我认为应该是

map((reports : IReport[]) => reports.filter(p => p.reportName === name))

代替

map((reports : IReport[]) => reports.find(p => p.reportName === name))

find将返回与条件IReport匹配的第一个p.reportName === name

答案 1 :(得分:1)

只需尝试将$tmp = (($a = foo()) === 0 ? $a : bar())->my_property = 1更改为find,find将仅获取一个对象,而filter将获取对象数组

filter

答案 2 :(得分:1)

用于过滤返回数据的更好解决方案将是rxjs的过滤器运算符

https://www.learnrxjs.io/operators/filtering/filter.html 然后,您可以轻松地将其传输到较旧的可观察对象,并返回可观察的过滤后的数据,您可以订阅