Каков наиболее эффективный способ обработки объектов, которые могут иметь или не иметь вложенные объекты?

#javascript #arrays #object #error-handling

Вопрос:

Допустим, я получаю следующий объект:

 Response: Shipment {
             Package: {
                  Activity: {}
                  PackageWeight: {}
             }
}
 

Это был бы базовый формат, однако, в зависимости от запроса , их может быть несколько Packages или несколько Shipments и т. Д.

Так что в настоящее время у меня есть if громоздкие настройки, в которых я, по сути,:

if (pyLd.TrackResponse.Shipment.Package.length > 1 ) и if (pyLd.TrackResponse.Shipment.Package[0].Activity.length > 1)
else if (pyLd.TrackResponse.Shipment.Package.Activity.length > 1)

и т. д. и т. д.

Есть ли лучший способ сделать это? Я думал, что у меня будут троичные операторы с необязательной цепочкой (пример ниже), но даже это становится громоздким.

  // check if more than one shipment
  let multiShip = () => {
     if ( pyLd.TrackResponse?.Shipment[1] !== undefined ) {
         // single shipment
         return 'single'
     }

     else {
         return 'multi'
     }
  }

  let multiPackage = () => {
      // check if multi shipment
      if (multiShip.match(/single/gi)){
          // single shipment, how many packages?
          if (pyLd.TrackResponse.Shipment?.Package[1] !== undefined){
              //single shipment, single package
              return {
                  shipments: 1,
                  packages: 1
              }
          }

          else {
              // single shipment, multi package
              return {
                  shipments: 1,
                  packages: 2
              }
          }
      }

      else {
          //multi shipment
          if (pyLd.TrackResponse.Shipment[0].Package[1] !== undefined){
              //multi shipment, single package
              return {
                  shipments: 2,
                  packages: 1
              }
          }

          else {
              // multi shipment, multi package
              return {
                  shipments: 2,
                  packages: 2
              }

          }

      }
  } 

Заранее спасибо!

Комментарии:

1. Значит, иногда Response.Shipment это массив объектов, иногда это один объект? То же самое для Package ? (Это плохой дизайн API…) Попробуй что-нибудь в этом роде return { shipments: Response.Shipment.length ?? 1, packages: Response.Shipment[0]?.Package?.length ?? Response.Shipment.Package.length ?? 1 } . Что делать, если Response.Shipment[0] Response.Shipment[1] у вас другое количество пакетов?

2. @SebastianSimon спасибо за комментарий. Response.Shipment[0] и Response.Shipment[1] неизменно будет иметь разное количество пакетов. Могут быть более глубокие вложенные объекты, имеющие ту же структуру. Это API UPS через их https://onlinetools.ups.com/json/Track конечную точку, которую я получаю через свой сервер NodeJS и возвращаю JSON через запрос POST. В любом случае, я думал, что мне нужно будет выполнить некоторую предварительную обработку на моем сервере ответа JSON путем сопряжения Object.keys() , Array.prototype.forEach() но меня беспокоит загрузка процессора при каждом выполняемом запросе…