如何将可观察对象和属性(字段)的数组映射到属性?

时间:2018-10-15 05:20:59

标签: arrays rxjs mapping observable

我目前正在以这种形式收到服务器的回复。

{
    plateNumber: string;
    vehicleId: number;
    garage: {
        garageName: string;
    };
    vehicleType: {
        vehicleType: string;
    };
    vehicleStatus: {
        status: string;
    };
    vehicleModel: {
        vehicleModelName: string;
    };
    vehicleOwner: {
        ownerName: string;
    };
    contactPhone: number;
    techInspectDueDate: Date;
    additionalInfo: string;
    lastDriver: string;
}

,但只想获取属性(字段)。只是字符串和数字。

{
    plateNumber: string;
    vehicleId: number;
    garageName: string;
    vehicleType: string;
    status: string;
    vehicleModelName: string;
    ownerName: string;
    contactPhone: number;
    techInspectDueDate: Date;
    additionalInfo: string;
    lastDriver: string;
}

当前,我正在使用HTTP后响应从服务器获取对象。

 getVehicles(): Observable<Vehicle[]> {
    const url = `${this.serviceUrl}`;
    return this.http.post<Vehicle[]>(url, {} );
  }

我需要在检查对象是否具有这些特定字段(车辆类型,状态,车辆模型名称,所有者名称,车库名称)时映射响应。 当我不确定对象是否具有这些字段或它是否已经是我需要的值(例如plateNumber)时,如何映射响应?

2 个答案:

答案 0 :(得分:1)

使用地图并返回您想要的任何内容。

 getVehicles(): Observable<Vehicle[]> {
    const url = `${this.serviceUrl}`;
    return this.http.post<Vehicle[]>(url, {}).pipe(
      map(vehicles => vehicles.map(vehicle => {
        return {
          plateNumber: vehicle.plateNumber;
          vehicleId: vehicle.vehicleId;
          garageName: vehicle.garage.garageName;
          //...map all other fields manually
        };
      })),
    );
  }

答案 1 :(得分:0)

您可能需要考虑以下解决方案

getVehicles().pipe(
  map(vehiclesArray => vehiclesArray.map(vehicle => getProperties(vehicle))
  )
)

其中getProperties是您必须编写的方法,该方法返回要拥有的对象。

考虑到map的第一个出现是RxJS提供的可管道运算符,而第二个是Array的方法。

在找不到所需属性的情况下,还必须确定行为方式。