【问题标题】:JSON Object containing Array包含数组的 JSON 对象
【发布时间】:2011-01-07 06:11:35
【问题描述】:

我有 JSON,比如,

var jsondata = {
  "an_array" : [[2,4],[1,2]]
} 

使用 JavaScript,我想使用 for 循环遍历数组中数组的每个元素,例如,

var grab_array = jsondata.an_array;
for (i = 0; i < grab_array.length; i++) {

 grab_array[i][0]; //doing stuff

}

但是,我知道这可能是一些严重的菜鸟问题,当我在 grab_array 上运行 typeof() 时,它说它是一个对象并且长度为 0。我该怎么办?

【问题讨论】:

  • 另外,我使用 jQuery $.post() 从将标头设置为 application/json 的 PHP 脚本中检索了 JSON。我还为 $.post() 设置了“json”参数,但尝试将其删除以进行测试。

标签: javascript arrays json


【解决方案1】:

嗯,我不能按照length0 的部分,你真的运行循环吗?它应该可以正常工作。

但是关于typeof 操作符,那个操作符(连同instanceof 操作符)可能是JavaScript 最大的设计缺陷。它即将被完全损坏

虽然instanceof仍有其有限的用途,但typeof确实只有一个 实际用例,不会发生检查对象的类型。

JavaScript 类型表

Value               Class      Type
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object (function in Nitro/V8)
new RegExp("meow")  RegExp     object (function in Nitro/V8)
{}                  Object     object
new Object()        Object     object

上表中的类型指的是typeof操作符返回的值。作为 你可以看到这绝不是一致的。

指的是对象内部[[Class]]属性的值。

来自规范: Class 可以是以下值之一: "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON""Math""Number""Object""RegExp""String"

为了检索 Class 的值,必须使用 toStringObject的方法。

检查对象的类

function is(type, obj) {
    return Object.prototype.toString.call(obj).slice(8, -1) === type;
}

is('String', 'test'); // true
is('String', new String('test')); // true

在上面的代码中,Object.prototype.toString 被调用 this 被设置为它的对象 值应该被检索。

检查变量是否已定义

typeof foo !== 'undefined'

上面会检查foo是否真的被声明了,因为刚刚 引用它会产生一个ReferenceError。这是唯一的事情 typeof其实是有用的。

总结一下

不要使用typeof,除非您正在检查变量是否存在。

【讨论】:

    【解决方案2】:

    嗯,对我来说,我可以轻松运行这段代码

    var jsondata = {
      "an_array" : [[2,4],[1,2]]
    }
    var grab_array = jsondata.an_array, 
        max = grab_array.length;
    for (i = 0; i < max; i++) {
    
     console.log(grab_array[i][0]); 
    
    }
    

    并且输出是非常符合预期的:2、1(每个都在新行上)。 关于问题的第二部分,您可以使用以下 sn-p 轻松测试 grab_array 是否为数组:

    if (grab_array.constructor == Array){
      //do stuff
    }
    

    在 ECMAScript5 中也可以使用 has Array.isArray() 函数,但是由于可能会遇到目标环境不支持 ECMAScript5 的情况,因此您可能需要添加此通用函数来测试 Object 是否为 Array :

    if (typeof Array.isArray === "undefined") {
     Array.isArray = function (arg) {
      return Object.prototype.toString.call(arg) === "[object Array]";
     };
    }
    

    然后简单地做:

    if (Array.isArray()){
      //do stuff
    }
    

    【讨论】:

    • 请注意,如果grab_array 来自另一个文档,则grab_array.constructor == Array 将失败,实际上只能使用isArray 解决方案,有关详细信息,请参阅我的答案:)
    【解决方案3】:

    检查类型时只需使用grab_array.constructor == Array 而不是typeof grab_array

    【讨论】:

      【解决方案4】:

      老实说,我不确定这里发生了什么。通过 jQuery JSON 解析器按原样抛出代码会导致我得到 an_array.length 为 2 的结果。 typeof 仍然将它列为对象,但它有一个长度,你的循环应该通过它。更多代码可能会有所帮助。

      作为调试提示,尝试在 Chrome 或 Firefox 中使用 jsondata 的 Firebug 进行 console.log 调用,看看会发生什么。确保 JSON 对象返回正确。但是,也就是说,您也可以使用 jQuery 实用程序来遍历每个元素,而不是使用 for 循环。尝试在上面使用jQuery.each()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2015-06-11
        • 2021-09-22
        • 2021-03-19
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多