2012-02-24 28 views
2

getJSONのJSONデータをドロップダウンに入力しています。getJSON操作が成功した後、data.lengthは未定義です

ポピュレーションは正常に動作していますが、data.lengthと比較して終了していることを確認しようとすると、data.lengthundefinedで動作しません。

{ 
    "1": { 
     "id": "1", 
     "name": "Plymouth" 
    }, 
    "2": { 
     "id": "2", 
     "name": "Torquay" 
    } 
} 

私のコードは次のようになります:よう

データが見えますこのセクション

$('.locationList').empty(); 
$('.locationList').append('<option value="">Select...</option>'); 
$.getJSON('/Settings/locations.txt', function (data) { 
    var dataNum = data.length; 
    var counter = 1; 
    $.each(data, function (i, item) { 
     $('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>'); 
     if (counter >= dataNum) { 
      $('#bookTo').val(locationID + 1); 
      $('#transferFrom').val(locationID); 
     }; 
     counter++; 
    }); 
}); 

if (counter >= dataNum) { 
    $('#bookTo').val(locationID + 1); 
    $('#transferFrom').val(locationID); 
}; 
counter++; 

は私がドロップの値をあらかじめ設定することを可能にするためのものです$.eachループが完了すると(これは他のリストでもうまくいきます)、しかし、それは起こっていません。

私はalert(data.length)を実行すると、私ははっきりとそれはそれがない$.eachを通じて適切にドロップダウンボックスを移入するためにlengthを持っているdataとしても意味がありませんundefinedを入手! EDITは

:申し訳ありませんが、追加する必要があり、変数locationIDは、以前のスクリプトでクッキーから宣言され、有効である

+1

[JavaScriptオブジェクトのリテラルの長さ===未定義?](http://stackoverflow.com/questions/4690520/javascript-object-literal-length-undefined)の可能な複製 'data'はオブジェクトであり、文字列ではありませんまたは配列である。オブジェクトは 'length'プロパティを公開しません。 –

+0

jQueryの.each()関数のインデックス値を持つとき、正確に 'dataNum'変数が必要なのはなぜですか? – adeneo

+0

'$ .each'がいつ終了したのかを判断するにはdataNum変数が必要です。なぜなら、ドキュメント内に何が表示されているにもかかわらず、そうでなければドロップダウンボックスの値の選択は完全に行われる前に起こるからです。 –

答えて

3

[]

{"response": [{"1":{"id":"1","name":"Plymouth"}}, 
{"2":{"id":"2","name":"Torquay"}}] } 

をこれがオブジェクトである:

data = { 
    "1": { 
     "id": "1", 
     "name": "Plymouth" 
    }, 
    "2": { 
     "id": "2", 
     "name": "Torquay" 
    } 
} 

、それはdoesnのlengthプロパティがあります。

参照:プロパティ1および2のみ。

は、あなたは、オブジェクトの評価者配列としてそれをしてもよろしいです:
data = [ 
    { 
     "id": "1", 
     "name": "Plymouth" 
    }, 
    { 
     "id": "2", 
     "name": "Torquay" 
    } 
] 

は、あなたが length財産と sortのような他のネイティブ配列のメソッドの多くを持っています。そして、あなたはこのようなあなたのデータにアクセスすることができます。おそらく、これを行うための最善の方法

{ 
    "id": "1", 
    "name": "Plymouth" 
} 
+0

を修正しました:D 'locations.txt'のソースを変更しました。 "2"、 "ラベル": "1"、 "名前": "プリマス"}、{"id": "2"、 "ラベル": "名前": ' "Torquay"}] ' –

1

あなたのJSON:

{"1":{"id":"1","name":"Plymouth"},"2":{"id":"2","name":"Torquay"}} 

は、オブジェクト、lengthそうでない配列ですプロパティが定義されていません。 ご使用のサーバーのような応答を与える必要がある配列としてそれを解析したい場合は、次の代わりに{}

+2

正しくありません!配列はjson: '{string:value、string:value}'のような文字列を受け取りません。配列は: '[value、value]' – andlrc

+0

正しいことができないか、関数の残りが失敗するでしょうか?ああ...読んで@AndreasAl答えは、このコメントと一緒に正しい方向に私を指している...並べ替え! –

+0

そう、これを指し示すタンク。私はエラー – andreapier

3

ないが、このようなものは、おそらく簡単な修正が考えられます。

data[0] 

魔女に等しいのですか?

$('.locationList').empty(); 
$('.locationList').append('<option value="">Select...</option>'); 
$.getJSON('/Settings/locations.txt', function (data) { 
    var dataNum = 0; 
    for (i in data) {if (data.hasOwnProperty(i)) {dataNum++;}}  
    var counter = 1; 
    $.each(data, function (i, item) { 
     $('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>'); 
     if (counter >= dataNum) { 
      $('#bookTo').val(locationID + 1); 
      $('#transferFrom').val(locationID); 
     }; 
     counter++; 
    }); 
}); 
+0

ええ、私はそれを考えました。この場合、それは非常に単純なリストなのでうまくいくでしょうが、それは良い習慣ではありません。 –

0

response.data == []、 この作品:

if (response.data.length === 0) 

これは次いで、長さprosprietyを有する配列です。

関連する問題