2013-08-30 6 views
1

API로 작업 중이며 이상한 형식의 데이터가 나에게 돌아오고 있습니다. 아니면 적어도 나에게있다. 데이터는 상점 운영 시간이며 프론트 엔드에서 필요로하는 방식으로 일치 시키려고합니다. (응용 프로그램은 Angular로 작성되어 API 2 개를 사용하므로 API를 사용하여 논리를 처리해야합니다JavaScript : 루프 내부의 루프 내에서 루프 최적화

홀수 구조 IMO
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"} 
] 

, 나는 요일을 선호했을 것이다 : 나는

이 데이터는 API에서 들어오는되는 형식입니다) 자신의 형식에 적응하지 않으 물체가되면 열린 시간과 닫힌 시간이 그 안에 숨어 있습니다. 내 응용 프로그램 (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 시간으로 제공하지 않고 영업 시간 만 제공합니다. 다른 API가 같은 구조에 의존하기 때문에 formattedHours의 구조를 변경할 수 없습니다. 객체에

+0

길지 않은 짧은 이름을 가진 최종 객체를 열면 더 빠를 수 있습니다. – Markasoftware

+0

'// 첫 번째 속성 이후 루프가 강제 종료됩니다. ' "첫 번째 속성"이 없습니다. 'for-in'을 사용할 때 반복 순서에 의존해서는 안됩니다. –

+0

우우, 나는 그것을 몰랐다. 머리를 가져 주셔서 감사합니다. 그것이 순서대로 오지 않는다면 그것은 정말로 일을 망칠 것입니다 : S. – Neil

답변

4

변경 daysOfWeek :

var daysOfWeek = { 
    Mon: "Monday", 
    Tue: "Tuesday", 
    ... 
}; 

그런 다음 당신은 그냥 대신 루프 daysOfWeek를 검색하는 daysOfWeek[property]에 액세스 할 수 있습니다.

2

짧은 이름의 해시로 시작하십시오.

var daysOfWeek = { 
    'Mon': 'Monday', 
    'Tue': 'Tuesday', 
    'Weds': 'Wednesday', 
    'Thur': 'Thursday', 
    'Fri': 'Friday', 
    'Sat': 'Saturday', 
    'Sun': 'Sunday' 
]; 

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]) { 
     var dow = daysOfWeek[property]; 
     if(dow && operatingHoursArray[i][property]) { 
      formattedHours[dow] = operatingHoursArray[i].Start + ' - ' + operatingHoursArray[i].End; 
      break; 
     } 
    } 
} 
0

주문한 컬렉션을 가지고 반복합니다. 각 항목에 대해 daysOfWeek에 대해 하나가 발견 될 때까지 operatingHoursArray을 반복 한 다음 문자열을 작성하십시오.

.forEach().every()을 사용하면 약간 클렌징합니다. .every()은 내부 루프에 사용되므로 일치 항목이 발견되면 반복을 중지 할 수 있습니다. 내가 포맷 된 문자열뿐 아니라 daysOfWeek 개체에 대한 원본 데이터를 추가 해요

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' } 
]; 

daysOfWeek.forEach(function(day) { 
    operatingHoursArray.every(function(item) { 
     if (item.hasOwnProperty(day.sform)) { 
      day.formatted = item.Start + ' - ' + item.End; 
      day.start = item.Start; 
      day.end = item.End; 
      day.open = item[day.sform] 
      return false; 
     } 
    }); 
}); 

알 수 있습니다.

이것은 사용자가 정의한 주문을 유지할 수 있도록하기위한 것입니다. 이제는 인덱스로 조회 할 수 있고 신뢰할 수있는 순서로 반복 할 수 있습니다. for-in을 사용할 때는 불가능합니다.