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(...))
Это хорошо.