RXJS映射和过滤器数组-返回单个对象而不是一个对象的数组?

时间:2019-05-24 17:37:01

标签: javascript arrays angular filter rxjs

我的服务上有一个方法可以获取所有模板,并返回一个Observable数组的Template对象。我正在尝试向服务中添加一个新方法,该方法获取模板数组,但对其进行过滤以按名称在数组中获取特定模板。

有没有一种方法可以使它只返回一个可观察的Template数组,而不是一个包含一个项的Observable Template数组?我对rxjs语法还很陌生,以至于我不了解如何使用诸如reduce之类的东西。

这是我获取所有模板的方法。

 getAllTemplates(): Observable<Template[]>{
    const uri = this.baseService.rootTemplatesUri;
    return this.http.get<Template[]>(uri)
      .pipe(
        catchError((error: HttpErrorResponse) => { return throwError(error); })
      );
  }

这是我尝试按名称过滤的操作,如果存在匹配的名称,它将返回一个包含一个元素的数组:

getTemplateByName(name:string):Observable<Template[]>{
    const uri = this.baseService.rootTemplatesUri;
    return this.http.get<Template[]>(uri)
      .pipe(
        map(templates => {
          return templates.filter(template => {
            return template.Name === name;
          })
        }),
       catchError((error: HttpErrorResponse) => { return throwError(error); })
     );

  }

是否有一种方法可以通过过滤此方法来返回单个Observable?

1 个答案:

答案 0 :(得分:1)

使用map RxJS运算符时,返回的observable具有在map运算符内部返回的类型。 JavaScript filter方法返回一个新数组,如its documentation中所述。这就是为什么您的getTemplateByName方法返回可观察到的Template[]元素的原因。

如果需要使getTemplateByName方法返回可观察的Template元素,则需要在Template运算符内返回单个map元素。 JavaScript find方法按照Array​.prototype​.find()中所述进行操作。只需使用它即可实现所需的行为。

getTemplateByName(name:string):Observable<Template>{
    const uri = this.baseService.rootTemplatesUri;
    return this.http.get<Template[]>(uri)
      .pipe(
        map(templates => {
          return templates.find(template => {
            return template.Name === name;
          })
        }),
       catchError((error: HttpErrorResponse) => { return throwError(error); })
     );

  }