私が本質的にする必要があるのは、次のようなjsonが与えられた場合です
{
"1" : "a",
"7" : "something"
"3" : {
"1" : "blah"
}
}
これらを配列に変換します (たとえば x)。
x[1] = "a"
x[7] = "something"
x[3] = y (where y[1] = "blah")
私が本質的にする必要があるのは、次のようなjsonが与えられた場合です
{
"1" : "a",
"7" : "something"
"3" : {
"1" : "blah"
}
}
これらを配列に変換します (たとえば x)。
x[1] = "a"
x[7] = "something"
x[3] = y (where y[1] = "blah")
JSON を非配列オブジェクト グラフに逆シリアル化してから、プロパティを配列にコピーする必要があります。私はそのためのショートカットを認識していません。
JSON を逆シリアル化した後の基本的なループobj
は、おおまかに次のとおりです。
var ar;
var key;
ar = [];
for (key in obj) {
if (obj.hasOwnProperty(key)) {
ar[key] = obj[key];
}
}
...ただし、それobj[key]
がオブジェクトであることを検出して再帰する必要があります。これについては、読者の演習として残します。
JavaScript では、配列は実際には配列ではないことに注意してください。ユースケースによっては、オブジェクトからオブジェクトへの変換をまったく行う必要がない場合がありますArray
。
Javascriptでは、これにアクセスできると確信しています:
x = {
"1" : "a",
"7" : "something",
"3" : {
"1" : "blah"
}
}
このような:
alert( x["1"] );
「a」を警告する必要があります。上記のコメントで既に述べたように、JS の配列は既に「オブジェクト」であり、これら 2 つの異なる方法で配列にアクセスすることに違いはありません。
編集:
ええ、私はそれをテストしましたが、動作します。また、私はこれを試しました:
alert( x[1] );
つまり、「文字列」の「1」ではなく、「数字」の1でやってみました。それでもうまくいきました。はい、非常に奇妙なプログラミング言語です。
これはかなり近いと思います:
function parse_obj(obj)
{
var array = [];
var prop;
for (prop in obj)
{
if (obj.hasOwnProperty(prop))
{
var key = parseInt(prop, 10);
var value = obj[prop];
if (typeof value === "object")
{
value = parse_obj(value);
}
array[key] = value;
}
}
return array;
}
これは私のために働く:
var obj = JSON.parse('{"1":"a","7":"something","3":{"1":"blah"}}');
var keys = Object.keys(obj).sort();
// Make obj look like it's an array by taking the highest value
// key and using it to give obj a length property.
obj.length = parseInt( keys[keys.length] ) + 1;
var arr = Array.prototype.slice.call(obj, 0);
arr は次のようになります。
[undefined, "a", undefined, Object, undefined, undefined, undefined, "something"]
わかりましたので、「内側の」JSON オブジェクトを配列に変換していませんが、上記と同じことを行う迅速な再帰ループでそれを整理する必要があります。