[英]Javascript - how to iterate through nested array with arrays and objects and why is my code not working?
我有一个包含许多嵌套数组和对象的数组。 我的代码无法正常工作,一遍又一遍地查看之后,我不明白为什么。 很难解释我的意思(很抱歉,如果我的标题问题也不太清楚,但是如果我不知道我的代码有什么问题,我也不知道该怎么解释),所以我把我的2问题将我的代码作为注释来理解-希望它可以理解! 非常感谢您的任何想法。
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'时,我得到一个空数组,但是当我将ALSO(与我之前的控制台日志相同)推到esteFlights对象并返回该对象并返回该对象时,以下两行显示,我实际上并没有得到一个空数组数组,但值。 我不知道为什么
console.log("test", toDestinationFlightsTemp)
flightObjects.push({
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;
这就是为什么您看到看起来像意外行为的原因:
首先,在函数flightObjects
之外定义变量。 然后,您将创建一个循环循环,该循环将运行两次:
for (var i = 0; i < allTrips.length; i++)
然后在该循环中,您初始化一个变量:
var toDestinationFlightsTemp = [];
每次循环时都会重新定义。 您console.log
它,它仍然是一个空数组,因为您还没有碰过它。
接下来,将空数组推入全局flightObjects
:
flightObjects.push({
toDestinationFlights: toDestinationFlightsTemp, //This for whatever reason works fine
returnFlights: returnFlightsTemp
})
这实际上不能正常工作flightObjects.toDestinationFlights
现在指向与toDestinationFlightsTemp
相同的空数组。 第一次通过循环,两个都打印空数组。 但是,当您在console.log
对其进行了记录之后, console.log
其中添加了元素:
flightsToLoc.Flight.forEach(function(flightTo, i) {
toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode);
})
由于toDestinationFlightsTemp
和flightObjects.toDestinationFlights
指向同一数组,因此toDestinationFlightsTemp
和flightObjects.toDestinationFlights
都具有您推入数组的元素。
现在,您再次循环。 在此循环上,您将重新定义为toDestinationFlightsTemp
并将其指向一个新的空数组。 但是flightObjects
仍然指向同一数组,并且引用了您第一次通过循环推送的元素。 因此,现在进入console.log
toDestinationFlightsTemp
为空,但flightObjects
仍然具有您第一次通过循环推送的元素。 因此,当您进行console.log
时,您会看到它们。
我认为 ,如果在尝试将值推入flightObjects
之前将其向上移动,将会发生您打算做的事情:
flightsToLoc.Flight.forEach(function(flightTo, i) {
toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode);
})
您的代码有效。 这是在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.