简体   繁体   English

Javascript-如何使用数组和对象遍历嵌套数组,为什么我的代码不起作用?

[英]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. 由于toDestinationFlightsTempflightObjects.toDestinationFlights指向同一数组,因此toDestinationFlightsTempflightObjects.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM