2012-03-15 20 views
2

JSON文字列があります:私はもともとPHPの配列から構築され、json_encodeを使用して変換されますJSONオブジェクトを持っているビルjavascript配列が、null値

var json = $.parseJSON(response); 
    var items = new Array(); 

    $.each(json, function(index, value){ 
    items[index] = value.id; 
    }); 

    console.log(items); 
    // returns [ , , , , , , , , , , , , , , , , , , , 19, 20 ]  

:(レスポンス)

{"19":{"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"},"20":{"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"}} 

JavaScriptのコードを。オブジェクトをループすると、値の一部に基づいて新しい配列を作成すると、すべての最初の項目としてnullがあり、最後の2つは実際のIDを持ちます。

私が間違っていることは何ですか?

+1

「19」と「20」という名前のプロパティを持つオブジェクトを構築しています。 '['と ']'を使って配列を作成します。 – nybbler

+0

JSONはPHP配列から変換されますが、JSONは配列ではないオブジェクトです。配列を期待している場合は、PHPを修正する必要があります。そのオブジェクトからのjavascriptにIDの配列が必要な場合は、$。eachのitems.push(value.id)を使用します。 – Dampsquid

答えて

2

itemsの配列を使用しているためです。 items[19]を設定するときは、最初に値0〜18を設定する必要があります(これらは「null」値です)。これは、JavaScriptには連想配列がなく、数値のみであるためです。

代わりにitemsのオブジェクトを使用してみてください。

var items = {}; 

$.each(json, function(index, value){ 
    items[index] = value.id; 
}); 

console.log(items); // {19: 19, 20: 20} 

P.配列内の「null」項目は、実際にはundefinedです。

2

オブジェクトからインデックスを使用しているので、スパース配列を作成しています。オブジェクトには「19」と「20」という名前のプロパティがあり、それらを配列のインデックスとして使用すると、そのプロパティから値を取得します。

あなたは配列の先頭からアイテムをパックしたい場合は、単にpushそれら:items

$.each(json, function(index, value){ 
    items.push(value.id); 
}); 

結果:

[ "19", "20" ] 
1

あなたはまた、配列にJSONレスポンスを変更することができます可能であれば:

[ 
    {"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"}, 
    {"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"} 
] 
0

MDN

プロパティが有効な配列インデックスであり、そのインデックスが配列の現在の境界外にある場合、配列は、エンジンは配列のlengthプロパティをそれに応じて更新します。

配列[19]を値に設定すると、配列[0-18]は未定義になります。

この問題を解決するには、オブジェクトを代わりにオブジェクトとして宣言します。これは、下位の範囲に自動的に値を設定せずに数値プロパティを割り当てることができます。