在Javascript中解析2维JSON数组

时间:2010-03-21 18:19:01

标签: javascript json

我有一个二维JSON数组,其中每个元素包含多个属性。以下示例有意简化:

var map_data = { "1":
                      {"1":{"name":"aa"},"2":{"name":"bb"}},
                 "2":
                      {"1":{"name":"cc"},"2":{"name":"dd"}}
               };

我尝试解析数据,但.length不起作用:

for(x=1; x<=map_data.length; x++) { 
    for(y=1; y<=map_data[x].length; y++) {
        // CODE 
    }
}

很多,非常感谢!

5 个答案:

答案 0 :(得分:7)

这不是一个数组,它们是简单的对象,这就是你不能使用length属性的原因。

您需要使用for...in声明:

for(var x in map_data) { 
  if (map_data.hasOwnProperty(x))
    for(var y in map_data[x]) {
      if (map_data[x].hasOwnProperty(y)) {
        // CODE
      }
    }
}

hasOwnProperty检查是因为此语句遍历所有属性,是否继承,以及某些内容(如某些JavaScript框架)是否增强了Array.prototypeObject.prototype个对象,这些增强属性也将被迭代。

你应该知道这个陈述无论如何都不能确保迭代的顺序。

我建议你使用“真正的”数组:

[
 [{"name":"aa"},{"name":"bb"}],
 [{"name":"cc"},{"name":"dd"}]
]

通过这种方式,您将能够使用length属性迭代索引。

答案 1 :(得分:2)

由于map_data是对象而不是数组,因此您需要使用for / in循环:

for (var x in map_data) {
  // check for hasOwnProperty omitted for simplicity.
  for (var y in map_data[x]) {
    // CODE.
  }
}

但最好将JSON作为数组[a,b,c]而不是对象{"0":a,"1":b,"2":c}发送。

答案 2 :(得分:2)

hasOwnProperty用于确定对象是否具有指定属性作为该对象的直接属性,而不考虑其原型链。

for(var i in map_data){
    if(map_data.hasOwnProperty(i)){
        for(var j in map_data[i]){
            if(map_data[i].hasOwnProperty(j)){
                /*do whatever you want with map_data[i][j]*/
            }
        }
    }
}

答案 3 :(得分:0)

使用for .. in构造:

for (var m in map_data) {
     // ...
}

另外,我必须注意,这不是“JSON数组”,而是嵌套对象。 JSON只是嵌套JS对象和数组的字符串表示。

答案 4 :(得分:0)

如果它对某人有帮助,那就是c#和javascript的一个例子:

C#:

List<List<string>>  list_array = new List<List<string>>();

JavaScriptSerializer jss = new JavaScriptSerializer();
string _myJSONstring = jss.Serialize(list_array); 

/ *在这种情况下,list_array是一个二维列表,但可以是一个数组, 如果你打印_myJSONstring,这将显示如下:“[[”XX“,”AAAA“],[”YY“,”BBBB“]]”* /

的javascript:

到一个从c#中获取字符串的函数:

var a = JSON.parse(array);
    for (var t = 0; t < array.length; t++) {
        for (v = 0; v < array[t].length; v++) {
            alert(array[t][v]);
        }
    }