[英]Javascript - how to iterate through nested array with arrays and objects and why is my code not working?
I have an array with many nested arrays and objects. 我有一个包含许多嵌套数组和对象的数组。 My code doesn't work and after looking at it over and over again, I don't understand why.
我的代码无法正常工作,一遍又一遍地查看之后,我不明白为什么。 Its hard to explain what I mean (sorry if my title question was also not very clear, but I didn't know how to explain what I mean, if I don't know whats wrong in my code), so I put my 2 questions insight my code as comments - I hope its understandable!
很难解释我的意思(很抱歉,如果我的标题问题也不太清楚,但是如果我不知道我的代码有什么问题,我也不知道该怎么解释),所以我把我的2问题将我的代码作为注释来理解-希望它可以理解! Thanks a lot for any ideas.
非常感谢您的任何想法。
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"
}
}];
My code: 我的代码:
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.) when I console log 'toDestinationFlights'-I get an empty array, but 2 lines below when I push ALSO (same as I console log before) toDestinationFlights to my flightObjects object and return that object, Im actually not getting back an empty array, but values. 1.)当我控制台登录'toDestinationFlights'时,我得到一个空数组,但是当我将ALSO(与我之前的控制台日志相同)推到esteFlights对象并返回该对象并返回该对象时,以下两行显示,我实际上并没有得到一个空数组数组,但值。 I don't know why.
我不知道为什么
console.log("test", toDestinationFlightsTemp)
flightObjects.push({
2.) What was intended here: toDestinationFlights: toDestinationFlightsTemp.concat(returnFlights[0]) - I want the values from toDestinationFlightsTemp and the first value from returnFlightsTemp this doesnt work because again, somehow Im getting an empty array 2.)此处的意图是:toDestinationFlights:toDestinationFlightsTemp.concat(returnFlights [0])-我希望toDestinationFlightsTemp的值和returnFlightsTemp的第一个值不起作用,因为再次出现,我以某种方式获取了一个空数组
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;
Here's why you're seeing what looks like unexpected behavior: 这就是为什么您看到看起来像意外行为的原因:
First you define variable outside the function flightObjects
. 首先,在函数
flightObjects
之外定义变量。 Then you make a loop loop that will run twice: 然后,您将创建一个循环循环,该循环将运行两次:
for (var i = 0; i < allTrips.length; i++)
Then inside that loop you initialize a variable: 然后在该循环中,您初始化一个变量:
var toDestinationFlightsTemp = [];
This gets redefined every time through the loop. 每次循环时都会重新定义。 You
console.log
it and it's still an empty array because you haven't touched it. 您
console.log
它,它仍然是一个空数组,因为您还没有碰过它。
Next you push that empty array onto the global flightObjects
: 接下来,将空数组推入全局
flightObjects
:
flightObjects.push({
toDestinationFlights: toDestinationFlightsTemp, //This for whatever reason works fine
returnFlights: returnFlightsTemp
})
This doesn't actually work fine — flightObjects.toDestinationFlights
is now pointing to the same empty array as toDestinationFlightsTemp
. 这实际上不能正常工作
flightObjects.toDestinationFlights
现在指向与toDestinationFlightsTemp
相同的空数组。 The first time through the loop, both print empty arrays. 第一次通过循环,两个都打印空数组。 But then, after you've
console.log
ed it, you add elements to it: 但是,当您在
console.log
对其进行了记录之后, console.log
其中添加了元素:
flightsToLoc.Flight.forEach(function(flightTo, i) {
toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode);
})
Since toDestinationFlightsTemp
and flightObjects.toDestinationFlights
point to the same array, both toDestinationFlightsTemp
and flightObjects.toDestinationFlights
have the element you pushed into the array. 由于
toDestinationFlightsTemp
和flightObjects.toDestinationFlights
指向同一数组,因此toDestinationFlightsTemp
和flightObjects.toDestinationFlights
都具有您推入数组的元素。
Now you loop again. 现在,您再次循环。 On this loop you redefine
toDestinationFlightsTemp
and point it to a new empty array. 在此循环上,您将重新定义为
toDestinationFlightsTemp
并将其指向一个新的空数组。 But flightObjects
still points to the same array and has a reference to the elements you pushed the first time through your loop. 但是
flightObjects
仍然指向同一数组,并且引用了您第一次通过循环推送的元素。 So now when you get to the console.log
s toDestinationFlightsTemp
is empty, but flightObjects
still has the elements you pushed the first time though the loop. 因此,现在进入
console.log
toDestinationFlightsTemp
为空,但flightObjects
仍然具有您第一次通过循环推送的元素。 So you see those when you console.log
it. 因此,当您进行
console.log
时,您会看到它们。
I think what you were intending to do would happen if you moved this up before you try to push the values into flightObjects
: 我认为 ,如果在尝试将值推入
flightObjects
之前将其向上移动,将会发生您打算做的事情:
flightsToLoc.Flight.forEach(function(flightTo, i) {
toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode);
})
Your code works. 您的代码有效。 Here is how to make an embedded code snippet on Stackoverflow :
这是在Stackoverflow上制作嵌入式代码段的方法:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.