我有一个我在php中创建的multidiminsional数组,它被传递回jQuery脚本。我需要遍历这个数组并处理数据。
在Firebug中,我可以看到数据位于data.data.items。我已经尝试使用data.data.items.length查找数组的长度,但它返回未定义。有趣的是,这在我的php部分正常工作之前有效,当它传回8个空项目的数组时。现在它已经填充(并且索引是字符串),长度不起作用。每个项目中还有一个对象。什么打破了这个?
答案 0 :(得分:1)
尽管如此,JavaScript中的数组仍是一个对象。使用字符串(或任何非整数)设置值时,实际上是在设置对象的属性(实际上,在使用整数键设置时也是如此,但处理方式略有不同)。
对于使用字符串作为键后突然断开的问题,我希望PHP能够实现当你拥有一个诚实的数组而不是一个关联数组,因此它会发送数组(由[]
包围)当所有键都是整数时,对象(由{}
包围)否则。我相信在字符串键控的情况下,PHP正在生成对象,因此.length
变为未定义(而不是在空数组中为0)。
要回答您的问题,可以通过一种简单的方法来计算此数据的“长度”:
var i = 0;
for (var item in data.data.items) {
i++;
}
将迭代data.data.items
的每个属性并计算它们。请注意,如果您(或您包含的任何库)向Object
原型添加属性,则不会产生预期结果。这种情况相当罕见,但在使用for..in
时必须注意这一点。
您可以使用Nagh建议的方法解决此问题,该方法忽略未在该特定对象上定义的属性:
var i = 0;
for (var item in data.data.items) {
if(data.data.items.hasOwnProperty(item)) {
i++;
}
}
答案 1 :(得分:0)
你总是可以使用“foreach”类循环。在这种情况下,你不需要知道那里有什么数组长度,甚至不知道它是否为数组,因为你可以迭代对象属性。
正如Joe已经指出的那样,javascript没有关联数组,当你尝试使用关联数组时 - 你最终得到了具有属性的对象。但是,如果你确定,只有这个对象获得的属性 - 是你的数组,你可以使用这样的代码:
for (i in arr) {
if (arr.hasOwnProperty(i)) {
//do something with arr[i]
}
}
但是如果你真的需要一个数组,可以考虑使用整数作为数组索引。