我有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.我应该做什么?
答案 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()。