3

ここで実際の例を見ることができます:

http://jsfiddle.net/bwhitney/ZDHP4/1/

JavaScript でオブジェクトの配列を作成しようとしています。オブジェクトにアクセスしようとすると、「未定義」の出力が得られます。サンプルコードは次のとおりです。

var dates = [];

var beginDate1 = new Date("01 / 01 / 01");
var endDate1 = new Date("02 / 02 / 02");
var beginDate2 = new Date("03 / 03 / 03");
var endDate2 = new Date("04 / 04 / 04");

// this outputs the correct dates
alert("before: " + beginDate1 + "--" + endDate1);
alert("before: " + beginDate2 + "--" + endDate2);

dates.push({
    "beginDate": beginDate1,
    "endDate": endDate1
}, {
    "beginDate": beginDate2,
    "endDate": endDate2
});

var date;
for (date in dates) {
    // this outputs "date: undefined--undefined"
    // why would that be?
    alert("after: " + date.beginDate + "--" + date.endDate);
}
4

4 に答える 4

6

for ... inJavaScriptのループは、値ではなく、オブジェクトのキーを提供します。

ただし、実際には数値インデックスを使用する必要があります。

for (var date = 0; date < dates.length; ++date) {
  alert("date " + date + " is: " + dates[date]);
}

を使用してキーを反復処理してfor ... inも、数値でインデックス付けされた配列要素のみが取得されるわけではありません。まるで普通のオブジェクトであるかのように配列を操作します。他のプロパティも取得されます。さらに、番号の昇順で表示される保証もありません。

于 2012-06-07T19:38:58.747 に答える
1

各ループでよくある間違い。dateのインデックスですdates。あなたは書くべきです:dates[date].beginDate

于 2012-06-07T19:39:06.580 に答える
0

for..inループを使用する場合、変数には値ではなくキーが割り当てられます。

for (date in dates) {
    alert('after: ' + dates[date].beginDate ...);
}
于 2012-06-07T19:39:01.613 に答える
0

for ... in配列ではそのようには機能しませんfor。このフィドルのような通常のものを使用できます: http://jsfiddle.net/bwhitney/ZDHP4/1/

参照:配列反復で「for...in」を使用するのはなぜ悪い考えですか?

于 2012-06-07T19:45:08.803 に答える