我有一个在 php 中创建的多维数组,它被传递回 jQuery 脚本。我需要遍历这个数组并处理数据。
在 Firebug 中,我可以看到数据位于 data.data.items。我尝试使用 data.data.items.length 查找数组的长度,但它返回为未定义。有趣的是,这在我的 php 部分在传回一个包含 8 个空项的数组之前正常工作。现在它已填充(并且索引是字符串),长度不起作用。每个项目中还有一个对象。这是什么问题?
我有一个在 php 中创建的多维数组,它被传递回 jQuery 脚本。我需要遍历这个数组并处理数据。
在 Firebug 中,我可以看到数据位于 data.data.items。我尝试使用 data.data.items.length 查找数组的长度,但它返回为未定义。有趣的是,这在我的 php 部分在传回一个包含 8 个空项的数组之前正常工作。现在它已填充(并且索引是字符串),长度不起作用。每个项目中还有一个对象。这是什么问题?
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++;
}
}
您始终可以使用“foreach”类型的循环。在这种情况下,您不需要知道有多少数组长度,甚至不需要知道它是否为数组,因为您也可以遍历对象属性。
正如乔已经指出的那样,javascript 没有关联数组,当您尝试使用关联数组时 - 您最终会得到具有属性的对象。但是,如果你确定,这个对象只有属性 - 是你的数组,你可以使用这样的代码:
for (i in arr) {
if (arr.hasOwnProperty(i)) {
//do something with arr[i]
}
}
但是,如果您确实需要一个数组,请考虑使用整数作为数组索引。