2

jQueryスクリプトに返されるphpで作成した多次元配列があります。この配列を繰り返し処理し、データを処理する必要があります。

Firebug では、データが data.data.items にあることがわかります。data.data.items.length を使用して配列の長さを見つけようとしましたが、未定義として返されます。興味深いことに、これは 8 つの空の項目の配列を返したときに私の php 部分が正しく機能する前に機能していました。データが入力された (インデックスは文字列) ため、長さは機能しません。それぞれのアイテムにもオブジェクトがあります。何がこれを壊していますか?

4

2 に答える 2

1

それにもかかわらず、JavaScriptの配列はオブジェクトです。文字列(または整数以外のもの)を使用して値を設定する場合、実際にはオブジェクトのプロパティを設定します(整数キーを使用して設定する場合も実際にこれを行いますが、処理は少し異なります)。

文字列をキーとして使用した後の突然の破損の問題については、PHPは、連想配列ではなく正直な配列を使用している場合に認識されるため[]、すべてのキーが整数である場合に配列(で囲まれている)を送信し、オブジェクトを送信することを期待します。 (で囲まれて{}います)それ以外の場合。文字列キーの場合、PHPはオブジェクトを生成して.lengthいるため、(空の配列のように0ではなく)未定義になると思います。

あなたの質問に答えるために、このデータの「長さ」を数える簡単な方法があります:

var i = 0;
for (var item in data.data.items) {
    i++;
}

これは、の各プロパティを反復処理してdata.data.itemsカウントします。あなた(またはあなたが含めるライブラリ)がObjectプロトタイプにプロパティを追加した場合、これは期待される結果を生み出さないことに注意してください。これはかなり珍しいことですが、を使用するときは注意する必要がありますfor..in

Naghが提案したメソッドを使用してこれに対処できます。このメソッドは、その特定のオブジェクトで定義されていないプロパティを無視します。

var i = 0;
for (var item in data.data.items) {
    if(data.data.items.hasOwnProperty(item)) {
        i++;
    }
}
于 2012-08-11T01:13:43.703 に答える
0

いつでも「foreach」の種類のループを使用できます。この場合、オブジェクトのプロパティも反復処理できるため、配列の長さが何であるか、または配列であるかどうかを知る必要はありません。

Joeがすでに指摘しているように、javascriptには連想配列がなく、連想配列を使おうとすると、プロパティを持つオブジェクトになってしまいます。ただし、確かに、このオブジェクトが取得したプロパティのみが配列である場合は、次のようなコードを使用できます。

for (i in arr) {
  if (arr.hasOwnProperty(i)) {
    //do something with arr[i]
  }
}

ただし、本当に配列が必要な場合は、配列インデックスとして整数を使用することを検討してください。

于 2012-08-11T01:13:50.177 に答える