Я работаю с API, и он возвращает данные мне в нечетном формате. Или это по крайней мере для меня. Данные - часы работы магазина, я хочу их сопоставить с тем, как они мне нужны в интерфейсе (приложение написано в Angular, использует два API, поэтому мне нужно заставить API работать с моей логикой Я не хочу, чтобы приспособиться к их формату)JavaScript: оптимизация цикла внутри цикла внутри цикла
Это формат данных, поступающие из API:
var operatingHoursArray = [
{Weds: true, End: "17:00", Start: "09:00"},
{Tue: true, End: "17:00", Start: "09:00"},
{Thur: true, End: "17:00", Start: "09:00"},
{Sun: false, End: "", Start: ""},
{Sat: true, End: "17:00", Start: "09:00"},
{Mon: true, End: "17:00", Start: "09:00"},
{Fri: true, End: "17:00", Start: "09:00"}
]
Странная структура ИМО, я предпочел бы в дни недели быть объектами, затем открытые и закрытые часы, заключенные в них. Мое приложение (AngularJS) требует данных, чтобы быть в следующем формате:
var formattedHours = {
Sunday: 'Closed',
Monday: 'Closed',
Tuesday: 'Closed',
Wednesday: 'Closed',
Thursday: 'Closed',
Friday: 'Closed',
Saturday: 'Closed'
};
времена значение по умолчанию «Закрыто», это код, я использую, чтобы соответствовать день недели с форматом я требую его в:
var daysOfWeek = [
{ sform: 'Mon', lform: 'Monday' },
{ sform: 'Tue', lform: 'Tuesday' },
{ sform: 'Weds', lform: 'Wednesday' },
{ sform: 'Thur', lform: 'Thursday' },
{ sform: 'Fri', lform: 'Friday' },
{ sform: 'Sat', lform: 'Saturday' },
{ sform: 'Sun', lform: 'Sunday' }
];
// Loop through the operating hours for the dealer
for (var i = operatingHoursArray.length - 1; i >= 0; i--) {
// Loop through the property names for each day, getting the first property name (the day of week)
for (property in operatingHoursArray[i]) {
// Loop through the days of the week
for (var v = daysOfWeek.length - 1; v >= 0; v--) {
// If the day of the week (array) matches the property name, get the details
if(daysOfWeek[v].sform == property && operatingHoursArray[i][property] === true) {
formattedHours[daysOfWeek[v].lform] = operatingHoursArray[i].Start + ' - ' + operatingHoursArray[i].End;
}
};
break; // Forces loop to stop after first property
}
};
Это становится очень неприятным очень быстро, но с моим знанием (уровень нуба), я не уверен, как сделать это любым более эффективным. Он работает для того, что мне нужно, но есть ли лучший способ кодировать это? В настоящее время он должен работать 49 раз, чтобы проверять каждый день недели. Кроме того, некоторые магазины не предоставляют 7 дней в часах, вместо этого предоставляют только часы, в которые они открыты. Я не могу изменить структуру formattedHours
, потому что другой API зависит от той же структуры.
Если вы открыты для конечного объекта с короткими именами вместо длинного, это может быть намного быстрее. – Markasoftware
'// Заставляет цикл останавливаться после первого свойства. Нет« первого свойства ». Вы не должны полагаться на порядок итераций при использовании 'for-in'. –
Ооо, я не знал этого, спасибо за головы. Это действительно повредит, если они не придут в порядок: S. – Neil