2017-10-22 4 views
0

私は多くのネストされた配列とオブジェクトを持つ配列を持っています。私のコードはうまくいかず、何度も何度も見てから、私は理由を理解しません。私のタイトルの質問があまり明確ではない場合は申し訳ありませんが、私のコードで何が間違っているかわからない場合は、どういう意味を説明するのか分からなかったので、2質問がコメントとして私のコードを洞察する - 私は理解できることを願っています!どんなアイデアにも感謝します。Javascript - 配列とオブジェクトをネストした配列を反復処理する方法と、なぜコードが機能しないのですか?

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'が-Iは空の配列を取得する」ログ・コンソールが、私もまた、押したときに、以下の2行(同じ私は前にログコンソールとして) toDestinationFlightを私のflightObjectsオブジェクトに返し、そのオブジェクトを返します。Im実際に空の配列を返さず、値を返します。どうしてか分かりません。

ここで意図していた何
   console.log("test", toDestinationFlightsTemp) 
      flightObjects.push({ 

2):toDestinationFlights:toDestinationFlightsTemp.concat(returnFlights [0]) - 再び、何とかImが空を取得しているので、私はこのdoesntの仕事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; 
+2

あなたのコードが実行可能にしてくださいとコメントにメモを変換し、それは頭の中のそのようなコードの量をデバッグするのはかなり難しい – Flying

+0

あなたは正確にどのような情報をあなたのデータセットから抽出しようとしていますか? 'getAirportNameToLocation'は、すべての 'DepartureAirport-> LocationCode'を持つ配列が必要だと教えてくれますか? –

+1

私はちょうどあなたのコードをテストしました。私の場合、両方のコンソールログは空の配列を返します。それは上の4行ごとに空白を明示的に作成するので驚くことではありません。 – leaf

答えて

2

ここにあります:

まずあなたが機能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ポイントを、両方toDestinationFlightsTempflightObjects.toDestinationFlightsあなたは、配列の中に押し込ま要素を持っています。

今度はループします。このループでは、toDestinationFlightsTempを再定義し、新しい空の配列をポイントします。しかしflightObjectsはまだ同じ配列を指していて、ループを介して最初にの時間をにプッシュした要素への参照を持っています。だからconsole.logに入るときtoDestinationFlightsTempは空ですが、flightObjectsにはまだループを通過した要素があります。だからあなたはそれらを参照してくださいconsole.log

私はあなたが何を意図したものをはあなたがflightObjectsに値をプッシュしようとする前に、あなたがこれを動かしたらどうなると思う

 flightsToLoc.Flight.forEach(function(flightTo, i) { 
      toDestinationFlightsTemp.push(flightTo.DepartureAirport.LocationCode); 
     }) 
+0

この明白な答えをありがとう!それは理にかなって、私はそれぞれのループを上げて以来、それは素晴らしい作品:) – javascripting

0

コードが機能します。ここで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);

+0

あなたのコードは残念ながらエラーを投げます – javascripting

+0

@javascripting "Run code snippet"を押すとエラーは表示されません。 – leaf

+0

私はあなたのコードを実際に貼り付けてコピーし、それにエラーが表示されます。 – javascripting

関連する問題