【问题标题】:Parse 2 dimensional JSON array in Javascript在 Javascript 中解析二维 JSON 数组
【发布时间】:2011-01-30 02:19:23
【问题描述】:

我有一个二维 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 
    }
}

非常感谢!

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    这不是一个数组,它们是简单的对象,这就是你不能使用 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】:

    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】:

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

      【讨论】:

        【解决方案4】:

        使用for .. in 构造:

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

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

        【讨论】:

          【解决方案5】:

          如果它对某人有帮助,它是 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]);
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-02
            • 2020-01-14
            • 1970-01-01
            • 2020-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            相关资源
            最近更新 更多