HttpClient GET преобразовать ответный массив объектов

Ниже моя модель.

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 ответ

Решение

Это зависит от того, что вы хотите, чтобы конечное возвращаемое значение было, т. Е. Поток 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(...)) Это хорошо.

Другие вопросы по тегам