HttpClient GET 转换对象的响应数组

HttpClient GET transform response array of Objects

以下是我的模型。

export interface AuditTrail {
    logAction:string,
    targetEmpId:string,
    createdDate:Date
}

下面的代码从 GET 调用中检索数据并对其进行转换。

  public getAuditTrails() {
   return this.http.get<AuditTrail[]>(this.auditTrailUrl)
    .pipe(
      map((data :Object[]) =>  {
        return data.map(value => {
          const auditTrail:AuditTrail = {
            logAction:value["logAction"],
            targetEmpId:value["targetEmpId"]["empCode"],
            createdDate:value["loggedDateTime"]
          }
          return auditTrail;
        });
    })
    )
  }

这段代码工作正常。但是我的问题是如何避免数组 迭代 data.map(value => { 并使用 rxjs 运算符。

这个问题旨在提高我对 rxjs 运算符的理解,因此解决方案应该使用 rxjs 运算符。

这取决于您希望最终 return 值是什么,即 AuditTrail 对象流或单个 AuditTrail[] 数组。

流:

public getAuditTrails(): Observable<AuditTrail> {
 return this.http.get<SomeObject[]>(this.auditTrailUrl).pipe(
   flatMap(data => data),
   map<SomeObject, AuditTrail>(value => ({
     logAction:value["logAction"],
     targetEmpId:value["targetEmpId"]["empCode"],
     createdDate:value["loggedDateTime"]
   })
 );
}

上面,flatMap 获取源数组并将每个值作为一个新的可观察流中的项目发出,从而允许将每个单独的项目传递给后续的 map.

数组:

如果你想把它缩减为一个数组,你可以管道 toArray:

public getAuditTrails(): Observable<AuditTrail> {
 return this.http.get<AuditTrail[]>(this.auditTrailUrl).pipe(
   flatMap(data => data),
   map<SomeObject, AuditTrail>(value => ({
     logAction:value["logAction"],
     targetEmpId:value["targetEmpId"]["empCode"],
     createdDate:value["loggedDateTime"]
   }),
   toArray()
 );
}

就我个人而言,我认为平面映射没有任何优势,使用 map(data = data.map(...)) 没问题。