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);
        })

因为 toDestinationFlightsTempflightObjects.toDestinationFlights 指向同一个数组,所以 toDestinationFlightsTempflightObjects.toDestinationFlights 都有你推入数组的元素。

现在你再次循环。在此循环中,您重新定义 toDestinationFlightsTemp 并将其指向一个新的空数组。但是 flightObjects 仍然指向同一个数组,并且引用了您在循环中 第一次 推送的元素。所以现在当你到达 console.log 时,toDestinationFlightsTemp 是空的,但是 flightObjects 仍然有你第一次通过循环推送的元素。所以当你 console.log 时你会看到那些。

认为 如果你在尝试将值推入 flightObjects:

之前将其向上移动,你打算做的事情就会发生
        flightsToLoc.Flight.forEach(function(flightTo, i) {
            toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode);
        })