包含Array的JSON对象

时间:2011-01-07 06:11:36

标签: javascript arrays json

我有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

}

然而,我知道这可能是一些严重的noob东西,当我在grab_array上运行typeof()时,它说它是一个对象并且长度为0.我应该做什么?

4 个答案:

答案 0 :(得分:3)

我无法跟随length 0的部分,您实际上是在运行循环吗?它应该工作得很好。

但是关于typeof运算符,该运算符(与instanceof运算符一起)可能是JavaScript的最大设计缺陷。它已接近完全破碎

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

JavaScript Typetable

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

在上表中, Type 指的是typeof运算符返回的值。如 你可以看到这是一致的。

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

  

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

为了检索 Class 的值,必须使用 toString的{​​{1}}方法。

检查对象的类

Object

在上面的代码中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被设置为其对象 应检索 Class 值。

检查是否已定义变量

this

以上将检查typeof foo !== 'undefined' 是否实际声明,因为只是 引用它将导致foo。这是唯一的事情 ReferenceError实际上对。

有用

总结

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

答案 1 :(得分: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,每个都在新线上。 关于问题的第二部分,您可以使用以下代码段轻松测试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
}

答案 2 :(得分:1)

检查类型时,只需使用grab_array.constructor == Array代替typeof grab_array

答案 3 :(得分:0)

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

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