0

こんにちは、私は JavaScript にかなり慣れていないので、以下のようなオブジェクトをどうするかについて少し混乱しています。これを、各エントリがプロパティ seid x、y、z を持つ配列 pt に変換するにはどうすればよいですか?

これは、Chrome コンソールに表示されるものです。 Object {pt[2][y]: "1.3571934700012207", pt[0][selid]: "2", pt[0][z]: "0", pt[3][x]: "3.6684491634368896", pt[2][z]: "0"…}

以下の例のように pt にアクセスしようとしている場合:

var X = pt[2].x;

「未定義のプロパティを読み取れません」というエラーが表示されます。これは、オブジェクトが「pt[2][y]」をキーとし、「1.3571934700012207」を値とする辞書に似ているためだと思います。ただし、プロパティ x、y、z、selid を持つオブジェクトを持つ配列 pt のようにアクセスしたいと考えています。データを必要な形式に変換/解析する方法はありますか? よろしくお願いします。

4

3 に答える 3

3

console.log(data)コメントで、 objコンテンツを取得するために行うと言っています。だからおそらくあなたはすべきです

var X = data["pt[2][x]"];

配列ptに変換する場合は、次のようにする必要があります。

var data = {
    "pt[0][x]" : 1, 
    "pt[1][x]" : 2, 
    "pt[2][y]" : 3, 
    "pt[2][z]" : 3
};

var pattern = /^pt\[([^\]]+)\]\[([^\]]+)\]$/i ;

var pt = [];
for( var key in data ){

    if ( pattern.test(key) ){
        var m = key.match(pattern);
        if( !pt[m[1]] ) pt[m[1]] = {};
        pt[m[1]][m[2]] = data[key];
    }
 }

alert(pt[0].x)
于 2012-12-01T18:26:45.723 に答える
1

読みにくい文章ですので、ご容赦ください。

しかし、これを試すことができます:

var v = {pt:new Array()};
for(var a in data) eval("if(!v." + /pt\[\d+\]/.exec(a) + ") v." + /pt\[\d+\]/.exec(a) + " = {}; v." + a.replace(/\]\[/,"][\"").replace(/\]$/,"\"]") + " = " + data[a]);

それから v はあなたが望むものを持つべきです。

(次のコード行を作成/実行するだけです:

if(!v.pt[2]) v.pt[2] = {}; v.pt[2]["y"] = 1.3571934700012207
if(!v.pt[0]) v.pt[0] = {}; v.pt[0]["selid"] = 2
if(!v.pt[0]) v.pt[0] = {}; v.pt[0]["z"] = 0
if(!v.pt[3]) v.pt[3] = {}; v.pt[3]["x"] = 3.6684491634368896
if(!v.pt[2]) v.pt[2] = {}; v.pt[2]["z"] = 0

)

于 2012-12-01T18:58:47.160 に答える
0

回答はすでに選択されていますが、元の要求された形式の JSON 表記は次のとおりです。

var pt=[
  {x:0,y:1,z:2,strid:"string"},
  {x:5,y:5,z:5,strid:"string2"}
];

これで、次のようなループを実行できます。

for(i=0;i<pt.length,i++){
  alert("x is:"+pt[i].x+" y is:"+pt[i].y+
       " z is:"+pt[i].z+" strid is:"+pt[i+].strid)
}
于 2012-12-01T19:36:22.293 に答える