Javascript - 如何使用数组和 objects 遍历嵌套数组,为什么我的代码不起作用?
Javascript - how to iterate through nested array with arrays and objects and why is my code not working?
我有一个包含许多嵌套数组和 object 的数组。我的代码不起作用,一遍又一遍地查看后,我不明白为什么。很难解释我的意思(对不起,如果我的标题问题也不是很清楚,但我不知道如何解释我的意思,如果我不知道我的代码有什么问题),所以我把我的 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(与我之前的控制台日志相同) toDestinationFlights 推送到我的 flightObjects object 和return 那 object,我实际上不是取回一个空数组,而是取回值。不知道为什么。
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;
您的代码有效。以下是如何在 Whosebug 上制作嵌入式代码片段:
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);
这就是您看到看似意外行为的原因:
首先在函数外定义变量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
编辑它之后,您可以向其中添加元素:
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);
})
我有一个包含许多嵌套数组和 object 的数组。我的代码不起作用,一遍又一遍地查看后,我不明白为什么。很难解释我的意思(对不起,如果我的标题问题也不是很清楚,但我不知道如何解释我的意思,如果我不知道我的代码有什么问题),所以我把我的 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(与我之前的控制台日志相同) toDestinationFlights 推送到我的 flightObjects object 和return 那 object,我实际上不是取回一个空数组,而是取回值。不知道为什么。
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;
您的代码有效。以下是如何在 Whosebug 上制作嵌入式代码片段:
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);
这就是您看到看似意外行为的原因:
首先在函数外定义变量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
编辑它之后,您可以向其中添加元素:
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);
})