#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()
но меня беспокоит загрузка процессора при каждом выполняемом запросе…