HttpClient GET преобразовать ответный массив объектов - PullRequest
0 голосов
/ 02 февраля 2019

Ниже приведена моя модель.

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 голосов
/ 04 февраля 2019

Это зависит от того, какой конечной возвращаемой величиной вы хотите быть, т.е. от потока AuditTrail объектов или одного массива AuditTrail[].

Stream:

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.

Array:

Если вы хотите, чтобы это было уменьшено до массива, вы можете передать 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(...)) хорошо.

...