在Javascript中解析二维JSON数组

4

我有一个二维的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个回答

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框架(如jQuery)增强了Array.prototypeObject.prototype对象,这些增强的属性也将被遍历。

需要注意的是,此语句不能确保迭代顺序。

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

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

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

指向真实数组的方向加1。令我惊讶的是,有多少问题涉及在对象上设置数字索引属性。 - Andy E

3

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]*/
            }
        }
    }
}

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}发送。


0
使用 for .. in 结构:
for (var m in map_data) {
     // ...
}

此外,我必须指出这不是一个“JSON数组”,而是一个嵌套对象。JSON只是嵌套JS对象和数组的字符串表示形式。

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]);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接