对象的HttpClient GET转换响应数组

时间:2019-02-02 18:57:48

标签: angular6 angular-httpclient rxjs6

以下是我的模型。

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运营商的理解。

1 个答案:

答案 0 :(得分:1)

这取决于您要最终返回的值是什么,即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(...))很好。