2016-09-04 4 views
1
window.onload = function() { 
    var arr = new Array; 
    var jsonObj = { 
    "123": "234" 
    }; 
    arr['v'] = "234"; 
    arr[0] = jsonObj; 
    arr[1] = jsonObj; 
    console.log(JSON.stringify(arr)); 
} 

消え上記のコードの結果は次のとおりです。のJS JSONに配列が、いくつかの値が

[{"123":"234"},{"123":"234"}] 

arr['v']が消えた理由を私は知らないのですか?

+0

アレイの誤用。その目的のためのオブジェクトでなければなりません。 –

+0

[JavaScriptの連想配列をjsonオブジェクトに変換してstringifyを使用するか、その逆の可能性があります](http://stackoverflow.com/questions/7089118/convert-a-javascript-associative-array-into-json-object-using-ストリング・アンド・ヴァイス) –

答えて

4

ObjectArrayは同じ方法でJSONに解析されません。

Arrayだけ数字キーが含まれます、そしてObjectは、そのキーのすべてが含まれます:

var Arr = [], Obj ={}; 
 

 
Arr[0] = Obj[0] = 'a'; 
 
Arr[1] = Obj[2] = 'b'; 
 
Arr['key'] = Obj['key'] = 'c'; 
 

 
console.log(JSON.stringify(Arr)); 
 
console.log(JSON.stringify(Obj));
あなたのケースで非常に

、あなたは、単にの代わりにOnjectを使用することができますが配列:

var arr = new Object; 
 
var jsonObj = {"123":"234"}; 
 
arr['v'] = "234"; 
 
arr[0] = jsonObj; 
 
arr[1] = jsonObj; 
 
console.log(JSON.stringify(arr));

-1

JavaScriptでは、基本的に2種類の配列、標準配列と連想配列です。標準配列は[]で定義され、0ベースの型インデックスです。連想配列は{}で定義されています。この場合、文字列をキーとして定義できます。だからあなたのコードでは両方を使用して単一の配列ですが、それは受け入れられません。文字列キーが必要な場合は、別の配列を定義します。

0

実際、JSON.stringifyは、配列JSON直列化中に配列内の非数値キーを無視します。最新のECMA Specのセクション"24.3.2.4 Runtime Semantics: SerializeJSONArray (value)"から、JSON.stringifyはArrayの長さと関連する数値キーのみを使用してシリアル化を行い、配列長は非数値キーの影響を受けないことがわかっています。だから、なぜあなたの最終結果で 'v'(非数字キー)が消えるのかはっきりしています。

0

文字列を整数の文字列表現でない限り、文字列を配列インデックスとして使用することはできません。

したがって、arr ['v']は意味を持ちません。

This stackoverflow questionは、より詳細になりますが、関連部分:

はい、技術的に配列-インデックスは文字列ですが、フラナガンはエレガント 彼の 'Definitive Guideの' でそれを置くよう:

「それをすべてのインデックスはプロパティ名ですが、0〜232-1の整数であるプロパティ名 のみがインデックスです。

関連する問題