2

我有一个在 php 中创建的多维数组,它被传递回 jQuery 脚本。我需要遍历这个数组并处理数据。

在 Firebug 中,我可以看到数据位于 data.data.items。我尝试使用 data.data.items.length 查找数组的长度,但它返回为未定义。有趣的是,这在我的 php 部分在传回一个包含 8 个空项的数组之前正常工作。现在它已填充(并且索引是字符串),长度不起作用。每个项目中还有一个对象。这是什么问题?

4

2 回答 2

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++;
    }
}
于 2012-08-11T01:13:43.703 回答
0

您始终可以使用“foreach”类型的循环。在这种情况下,您不需要知道有多少数组长度,甚至不需要知道它是否为数组,因为您也可以遍历对象属性。

正如乔已经指出的那样,javascript 没有关联数组,当您尝试使用关联数组时 - 您最终会得到具有属性的对象。但是,如果你确定,这个对象只有属性 - 是你的数组,你可以使用这样的代码:

for (i in arr) {
  if (arr.hasOwnProperty(i)) {
    //do something with arr[i]
  }
}

但是,如果您确实需要一个数组,请考虑使用整数作为数组索引。

于 2012-08-11T01:13:50.177 回答