Javascript: 数组.length 返回 undefined

63

我有一组数据,这些数据是由PHP的json_encode函数传递的。我正在使用jQuery的getJSON函数进行解码:

$.getJSON("url", function (data) {
    console.log(data);
});

在控制台中,输出结果看起来像这样:

Object {1: Object, 2: Object, 3: Object, 4: Object, 5: Object, 6: Object, 7: Object, 8: Object, 9: Object, 10: Object}
我可以通过使用 data[1]data[2]等来访问每个数组,但为了使它更容易,我想循环遍历它,以便一次性访问所有内容:
$.getJSON("url", function (data) {
    for (var i = 0, len = data.length; i < len; i++) {
        //do something
    }
});

然而,我无法使其正常工作,因为data.length返回值为undefined。出了什么问题?我该怎么解决?


它是一个对象,不是一个数组。 - Eugene P.
24
尝试使用"Object.keys(data).length"。 - putvande
2
看起来这不是一个数组,而是一个任意对象。如果您可以控制PHP序列化,您可能可以更改它。 - Scott Sauyet
1
+1 Scott 的说法:将 json_encode($something) 替换为 json_encode(array_values($something)) 即可轻松将其转换为真正的数组。 - raina77ow
@ScottSauyet 如果您能将其发布为答案,我可以将其标记为正确。 - rksh
显示剩余2条评论
5个回答

89

对象没有.length属性。

如果您知道不必担心hasOwnProperty检查,一个简单的解决方案是这样做:

Object.keys(data).length;

如果你必须要支持IE 8或更低版本,那么你就得使用循环来代替了:

var length= 0;
for(var key in data) {
    if(data.hasOwnProperty(key)){
        length++;
    }
}

1
针对IE >= 9 - Arun P Johny

30

一种选择是:

Object.keys(myObject).length

遗憾的是,在较旧的IE版本(低于9)下无法使用。

如果您需要兼容性,请使用繁琐的版本:

var key, count = 0;
for(key in myObject) {
  if(myObject.hasOwnProperty(key)) {
    count++;
  }
}

在这么多年过去之后,你为我节省了大量时间,非常感谢! - msc

7
看起来不是一个数组,而是一个任意对象。如果您控制PHP序列化,您可能可以更改它。
正如raina77ow所指出的那样,在PHP中完成这个任务的一种方法是替换类似于以下内容的东西:
json_encode($something) 

使用类似以下内容的东西:
json_encode(array_values($something))

但是不要忽略其他关于 Object.keys 的答案。如果您没有能力或不愿更改对象的序列化,则它们也应该实现您想要的结果。


2

试试这个

Object.keys(data).length

如果IE版本低于9,你可以使用for循环自行遍历该对象。
var len = 0;
var i;

for (i in data) {
    if (data.hasOwnProperty(i)) {
        len++;
    }
}

1
一个简单的解决方法是在你的json文件开头添加'[',并以']'结尾。这对我有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接