Как объединить отдельные списки объектов json в один массив объектов? - PullRequest
0 голосов
/ 23 октября 2018

Я получаю данные из базы данных в этой форме.

существует массив объектов, и каждый объект выглядит следующим образом.

  },
  {
    "vehicleId": 2287,
    "plateNumber": "GGS-733",
    "vehicleTypeId": 1,
    "driverId": null,
    "garageId": 1,
    "statusId": 0,
    "vehicleModelId": 18,
    "additionalInfo": null,
    "techInspectDate": "00:00:00",
    "person": null
  },
  {

Я также получаю списки объектов, включенных сюда отдельно.(garageId, statusId, vehicletypeId).Каждый из них имеет разные значения (например, vehicleType).Я хочу правильно сопоставить их с новым объектом, который вместо идентификаторов будет иметь значения этих объектов.

Я хочу получить конечный результат для объекта, который будет выглядеть следующим образом.

  },
  {
    "vehicleId": 2287,
    "plateNumber": "GGS-733",
    --> "vehicleType": "SUV",
    --> "driver": "John Smith",
    --> "garage": "Boston",
    --> "statusId": "available",
    "vehicleModelId": 18,
    "additionalInfo": null,
    "techInspectDate": "00:00:00",
    "person": null
  },
  { 

Есть несколько проблем, с которыми я сталкиваюсь.Мне нужно подождать, пока все списки будут полностью извлечены, пока я не попытаюсь сопоставить все с новым объектом.Мне нужно, чтобы порядок асинхронных событий был правильным.И я не могу оставлять списки в отдельных объектах и ​​получать к ним доступ при необходимости.Мой конечный результат должен быть одним объектом, как указано ранее, и мне нужно передать его функции, которая позже будет отображать его значения во внешнем интерфейсе.

В настоящее время я получаю список гаражей и других подобных объектов.

  public getGarages(): Observable<any[]> {
    const url = `${this.serviceUrl}lists/garages`;
    return this.http.get<any[]>(url);
  }

Ранее база данных давала мне целое дерево.Это означает, что автомобили включали весь объект гаража, а не просто гараж.Таким образом, у меня была функция getVehicles, выполняющая сопоставление для каждого из его объектов, принимая дочерние значения и копируя их в новое значение в объекте.но теперь у меня есть только Id.

getVehicles(): Observable<Vehicle[]> {
     const url = `${this.serviceUrl}`;
     return this.http.get<Vehicle[]>(url).pipe(
      tap(vehiclesArray => vehiclesArray.forEach(element => {

      //  element.garageName = element.garage.garageName;
      //  element.status = element.vehicleStatus.status;
      //  element.vtype = element.vehicleType.vehicleType;
      //  element.ownerName = element.owner.ownerName;
      //  element.vehicleModelName = element.vehicleModel.vehicleModelName;
      })));
  }

Одна из моих мыслей - создать какой-то счетчик, проверяющий, все ли подписки завершены, чтобы в основной функции транспортных средств я знал, что получил вседанные готовы.

Еще одна мысль, которую я получил, состояла в том, чтобы позволить одной функции вызывать другую, пока я не доберусь до функции основных транспортных средств, но это может замедлить процесс, потому что вызовы будут происходить последовательно, а не одновременно.время.

Как мне достичь конечного результата? Каков эффективный и правильный подход?

1 Ответ

0 голосов
/ 23 октября 2018

Вместо того, чтобы вызывать функцию транспортных средств последним, я понял, что лучше сначала вызвать ее и получить данные, а затем отредактировать объекты.Я написал функции, которые получают список JSON из ответа html.После того, как я получил список, я прошел по списку, прошел по моему объекту транспортных средств и скопировал значение, если идентификатор совпадает.

Это мой код getVehicles

getVehicles() {
    this.fleetService.getVehicles()
    .subscribe(value => {
      this.vehicles = value;
      this.getGarages();
      this.getVehicleTypes();
      this.getVehicleModels();
      this.dataSource = new MatTableDataSource(this.vehicles);
      this.dataSource.paginator = this.paginator;
      this.dataSource.sort = this.sort;
    });
  }

в транспортных средствах, которые я называю getGaragesи другие функции в подписке, так что данные готовы для функций для их редактирования.

все функции выглядят одинаково:

getGarages(): void {
    this.fleetService.getGarages().subscribe(result => {
      this.garages = result;
      this.vehicles.forEach(function (element) {
        this.garages.forEach(garage => {
          if (garage.garageId === element.garageId) {
            element.garageName = garage.garageName;
          }
        });
      }.bind(this));
    });
  }

единственная проблема, которую я нахожу в своем решении, эточто я зацикливаюсь на своем объекте транспортных средств каждый раз.Вместо зацикливания один раз и добавления всех значений.Если у кого есть идеи получше, поделитесь.

...