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

Jen*_*r S 2 javascript arrays filter rxjs angular

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

有没有办法让它只返回单个可观察模板,而不是包含一个项目的可观察模板数组?我对 rxjs 语法还很陌生,我不明白如何使用像reduce这样的东西。

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

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

Run Code Online (Sandbox Code Playgroud)

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

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); })
     );

  }
Run Code Online (Sandbox Code Playgroud)

有没有办法通过过滤返回单个 Observable?

Gos*_*ten 6

map使用 RxJS 运算符时,返回的 observable 具有运算符内部返回的类型map。JavaScriptfilter方法返回一个新数组,如其文档中所述。这就是为什么你的getTemplateByName方法返回一个可观察的Template[]元素。

\n\n

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

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