繁体   English   中英

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

[英]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);
        })

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

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