0

嗨,我对 JavaScript 相当陌生,我对如何处理像下面这样的对象有点困惑。如何将其转换为数组 pt,其中每个条目都具有属性 selid x、y、z?

这是我在 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”作为值。但是我想像数组 pt 一样访问它,其中的对象具有属性 x,y,z,selid。有没有办法将数据转换/解析成我想要的格式?提前非常感谢。

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 回答