Javascript:array.length返回undefined

时间:2014-02-04 12:20:33

标签: javascript jquery json

我有一组由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,我无法使用此功能。有什么问题,我该如何解决?

5 个答案:

答案 0 :(得分:67)

对象没有.length属性。

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

Object.keys(data).length;

如果 支持IE 8或更低版本,则必须使用循环,而不是:

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

答案 1 :(得分:16)

一个选项是:

Object.keys(myObject).length

可悲的是,它不适用于较旧的IE版本(9岁以下)。

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

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

答案 2 :(得分:5)

它看起来好像不是数组而是任意对象。如果您可以控制PHP序列化,那么您可以更改它。

作为 raina77ow pointed out,在PHP中执行此操作的一种方法是替换以下内容:

json_encode($something) 

有类似的东西:

json_encode(array_values($something))

但请不要忽略此处有关Object.keys的其他答案。如果你没有能力或想要改变对象的序列化,他们也应该完成你想要的。

答案 3 :(得分:2)

试试这个

Object.keys(data).length

如果IE&lt; 9,你可以用for循环遍历对象

var len = 0;
var i;

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

答案 4 :(得分:0)

此问题的一个简单解决方案是在json文件的开头添加“ [”,并以“]”结尾。这为我解决了。