2017-10-22 10 views
0

많은 중첩 배열과 객체가있는 배열이 있습니다. 내 코드가 작동하지 않으며 반복해서 살펴본 후 이유를 이해할 수 없습니다. 그게 내 말이 무슨 뜻인지 설명하기가 어렵다. (내 제목 질문도 분명하지 않지만 미안하다. 내 코드에서 무엇이 잘못되었는지 모른다면 내 말의 의미를 설명 할 수 없었다.) 그래서 나는 2 질문은 내 코드를 주석으로 통찰 함 - 이해할 수 있기를 바랍니다! 어떤 아이디어에 대해서도 고마워.Javascript - 배열과 객체가있는 중첩 배열을 반복하는 방법과 내 코드가 작동하지 않는 이유는 무엇입니까?

var trips= [{ 
    "Air": { 
     "OriginDestinationOptions": { 
      "OriginDestinationOption": [{ 
       "Flight": [{ 
        "DepartureAirport": { 
         "LocationCode": "JFK" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "SVO" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }, { 
        "DepartureAirport": { 
         "LocationCode": "SVO" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "TXL" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 

       }, 
       { 
        "DepartureAirport": { 
         "LocationCode": "TXL" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "LHR" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 

       }], 
       "ElapsedTime": 915 
      }, { 
       "Flight": [{ 
        "DepartureAirport": { 
         "LocationCode": "LHR" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "LAX" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }, { 
        "DepartureAirport": { 
         "LocationCode": "LAX" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "TXL" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }, 
       { 
        "DepartureAirport": { 
         "LocationCode": "TXL" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "LHR" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 

       }], 
       "ElapsedTime": 1425 
      }] 
     }, 
     "DirectionInd": "Return" 
    } 
}, 
{ 
    "Air": { 
     "OriginDestinationOptions": { 
      "OriginDestinationOption": [{ 
       "Flight": [{ 
        "DepartureAirport": { 
         "LocationCode": "JFK" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "SVO" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }, { 
        "DepartureAirport": { 
         "LocationCode": "SVO" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "LHR" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }], 
       "ElapsedTime": 915 
      }, { 
       "Flight": [{ 
        "DepartureAirport": { 
         "LocationCode": "LHR" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "SVO" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }, { 
        "DepartureAirport": { 
         "LocationCode": "SVO" 
        }, 
        "ArrivalAirport": { 
         "LocationCode": "JFK" 
        }, 
        "MarketingAirline": { 
         "Code": "SU" 
        } 
       }], 
       "ElapsedTime": 1125 
      }] 
     }, 
     "DirectionInd": "Return" 
    }   
}]; 

내 코드 :

var flightObjects = []; 

    function getAirportNameToLocation(obj) { 
     var allTrips = []; 
     for (var i = 0; i < obj.length; i++) {     

     allTrips.push(obj[i].Air.OriginDestinationOptions.OriginDestinationOption) 
     } 

     for (var i = 0; i < allTrips.length; i++) { 

      var toDestinationFlightsTemp = []; 
      var returnFlightsTemp = []; 
      //first FlightsSegment object --> to destination flights 
      var flightsToLoc = allTrips[i][0]; 

      //second FlightsSegment object --> return flights 
      var returnFlights = allTrips[i][1]; 

      console.log(toDestinationFlightsTemp) 

1) 나는 toDestinationFlights'가-I는 빈 상태 (empty)의 배열이 '로그 콘솔, 그러나 나는 또한 누르면 아래 2 개 라인 (같은 내가 전에 로그 콘솔로) toDestinationFight를 내 flightObjects 객체에 보내고 그 객체를 반환합니다. 실제로 Im은 빈 배열을 반환하지 않지만 값은 반환합니다. 나는 이유를 모른다. 어떻게 든 임 빈을 얻기 때문에 다시 toDestinationFlightsTemp의 값과 returnFlightsTemp에서 첫 번째 값이 나던 일을 할 - toDestinationFlightsTemp.concat (returnFlights [0]) : toDestinationFlights : 여기에 의도 무엇

   console.log("test", toDestinationFlightsTemp) 
      flightObjects.push({ 

2) 배열

    toDestinationFlights: toDestinationFlightsTemp, //This for whatever reason works fine 
       returnFlights: returnFlightsTemp 
      }) 

      flightsToLoc.Flight.forEach(function(flightTo, i) { 
       toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode); 
      }) 

      returnFlights.Flight.forEach(function(flightTo, i) { 
      returnFlightsTemp.push(flightTo.DepartureAirport.LocationCode) 
      }) 
     } 
     toDestinationFlightsARIVALTemp = toDestinationFlightsTemp.concat(returnFlightsTemp[0]); 
    } 
    getAirportNameToLocation(trips) 

    flightObjects; 
+2

이 코드가 실행 가능한 확인과 의견에 메모를 변환, 그것이 머리 안쪽에있는 그런 양의 코드를 디버그하는 것은 꽤 어렵습니다. – Flying

+0

그럼 정확히 어떤 데이터를 데이터로부터 추출하려고합니까? 'getAirportNameToLocation'은 'DepartureAirport-> LocationCode'를 가진 배열을 원한다는 것을 알려줍니까? –

+1

필자의 코드를 테스트했는데 두 경우 모두 콘솔 로그에 빈 배열이있다. 위의 4 줄마다 공백으로 명시 적으로 만들었 기 때문에 놀라지 않을 것이다. – leaf

답변

2

은 왜 예기치 않은 동작이 어떻게 생겼는지보고있다이다 :

먼저 함수 flightObjects 외부 변수를 정의 .

for (var i = 0; i < allTrips.length; i++) 

그런 다음 그 루프 내에서 사용자가 변수를 초기화 : 이것은 루프를 통해 모든 시간을 다시 정의됩니다

var toDestinationFlightsTemp = []; 

그럼 당신은 두 번 실행하는 루프 루프를합니다. 당신은 그것을 만지지 않았기 때문에 당신은 console.log입니다. 그리고 그것은 여전히 ​​빈 배열입니다.

flightObjects.push({ 
      toDestinationFlights: toDestinationFlightsTemp, //This for whatever reason works fine 
      returnFlights: returnFlightsTemp 
     }) 

이 실제로 잘 작동하지 않습니다 - flightObjects.toDestinationFlights 지금 toDestinationFlightsTemp 같은 빈 배열로 가리키는 :

다음 전역 flightObjects 위에 빈 배열이 있음을 밀어 넣습니다. 루프를 처음 실행할 때 모두 빈 배열을 인쇄합니다. 그러나, 당신은했습니다 후 console.log가 에드, 당신이 그것에 요소를 추가 :

flightsToLoc.Flight.forEach(function(flightTo, i) { 
      toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode); 
     }) 

toDestinationFlightsTemp 때문에 같은 배열에 flightObjects.toDestinationFlights 점을 모두 toDestinationFlightsTempflightObjects.toDestinationFlights 당신이 배열로 밀어 요소를 가지고있다.

이제 루프가 반복됩니다. 이 루프에서 toDestinationFlightsTemp을 다시 정의하고 새 빈 배열을 가리 킵니다.그러나 flightObjects은 여전히 ​​동일한 배열을 가리키며 루프를 통해 첫 번째로 시간을 밀어 넣은 요소에 대한 참조를가집니다. 이제 console.log에 도착하면 toDestinationFlightsTemp이 비어 있지만 flightObjects에는 루프를 통해 처음으로 푸시 한 요소가 있습니다. 그래서 당신은 그것들을 볼 때 console.log.

내가는 당신이 flightObjects에 값을 밀어하기 전에 당신이를 이동 한 경우 일어날 것이라고 할 의도했다 생각 :

 flightsToLoc.Flight.forEach(function(flightTo, i) { 
      toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode); 
     }) 
+0

이 분명한 답변을 주셔서 대단히 감사합니다 !!! 그것은 의미가 있고 지금까지 나는 forEach 루프를 움직이게 했으므로 그것은 아주 효과적이다 :) – javascripting

0

코드가 작동합니다. 여기에 유래  에 포함 된 코드를 만드는 방법입니다 :

var trips = [{ 
 
    "Air": { 
 
    "OriginDestinationOptions": { 
 
     "OriginDestinationOption": [{ 
 
     "Flight": [{ 
 
      "DepartureAirport": { 
 
      "LocationCode": "JFK" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "TXL" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "TXL" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "LHR" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }], 
 
     "ElapsedTime": 915 
 
     }, { 
 
     "Flight": [{ 
 
      "DepartureAirport": { 
 
      "LocationCode": "LHR" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "LAX" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "LAX" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "TXL" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "TXL" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "LHR" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }], 
 
     "ElapsedTime": 1425 
 
     }] 
 
    }, 
 
    "DirectionInd": "Return" 
 
    } 
 
}, { 
 
    "Air": { 
 
    "OriginDestinationOptions": { 
 
     "OriginDestinationOption": [{ 
 
     "Flight": [{ 
 
      "DepartureAirport": { 
 
      "LocationCode": "JFK" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "LHR" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }], 
 
     "ElapsedTime": 915 
 
     }, { 
 
     "Flight": [{ 
 
      "DepartureAirport": { 
 
      "LocationCode": "LHR" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }, { 
 
      "DepartureAirport": { 
 
      "LocationCode": "SVO" 
 
      }, 
 
      "ArrivalAirport": { 
 
      "LocationCode": "JFK" 
 
      }, 
 
      "MarketingAirline": { 
 
      "Code": "SU" 
 
      } 
 
     }], 
 
     "ElapsedTime": 1125 
 
     }] 
 
    }, 
 
    "DirectionInd": "Return" 
 
    } 
 
}]; 
 

 
var codesForEachTrip = []; 
 
for (let i = 0; i < trips.length; i++) { 
 
    let trip = trips[i]; 
 
    let origDestOpts = trip.Air.OriginDestinationOptions; 
 
    let origDestOpt = origDestOpts.OriginDestinationOption; 
 
    let outwardJourney = origDestOpt[0].Flight; 
 
    let inwardJourney = origDestOpt[1].Flight; 
 
    let codesForThisTrip = { 
 
    outwardJourney: [], 
 
    inwardJourney: [] 
 
    }; 
 
    for (let i = 0; i < outwardJourney.length; i++) { 
 
    let sub = outwardJourney[i]; 
 
    let code = sub.DepartureAirport.LocationCode; 
 
    codesForThisTrip.outwardJourney.push(code); 
 
    } 
 
    for (let i = 0; i < inwardJourney.length; i++) { 
 
    let sub = inwardJourney[i]; 
 
    let code = sub.DepartureAirport.LocationCode; 
 
    codesForThisTrip.inwardJourney.push(code); 
 
    } 
 
    codesForEachTrip.push(codesForThisTrip); 
 
} 
 
console.log(codesForEachTrip);
다음

+0

코드에서 불행하게도 오류가 발생합니다 – javascripting

+0

@javascripting "Run code snippet"을 누르면 오류가 표시되지 않습니다. – leaf

+0

코드를 실제 코드에 붙여 넣으면 오류가 발생합니다. – javascripting