Javascript:array.length返回undefined

rks*_*ksh 47 javascript jquery json

我有一组由PHP json_encode函数传递的数据.我正在使用jQuery getJSON函数对其进行解码:

$.getJSON("url", function (data) {
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

控制台中的输出如下所示:

Object {1: Object, 2: Object, 3: Object, 4: Object, 5: Object, 6: Object, 7: Object, 8: Object, 9: Object, 10: Object}
Run Code Online (Sandbox Code Playgroud)

我可以通过访问每个阵列data[1],data[2]等等,但更容易我想循环的思想,所以我能够同时访问所有:

$.getJSON("url", function (data) {
    for (var i = 0, len = data.length; i < len; i++) {
        //do something
    }
});
Run Code Online (Sandbox Code Playgroud)

但是我不能让它工作,因为data.length返回值undefined.有什么问题,我该如何解决?

Cer*_*rus 73

对象没有.length属性.

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

Object.keys(data).length;
Run Code Online (Sandbox Code Playgroud)

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

var length= 0;
for(var key in data) {
    if(data.hasOwnProperty(key)){
        length++;
    }
}
Run Code Online (Sandbox Code Playgroud)


rag*_*net 17

一种选择是:

Object.keys(myObject).length
Run Code Online (Sandbox Code Playgroud)

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

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

var key, count = 0;
for(key in myObject) {
  if(myObject.hasOwnProperty(key)) {
    count++;
  }
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*yet 5

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

正如raina77ow 指出的那样,在PHP中执行此操作的一种方法是替换以下内容:

json_encode($something) 
Run Code Online (Sandbox Code Playgroud)

有类似的东西:

json_encode(array_values($something))
Run Code Online (Sandbox Code Playgroud)

但是不要忽视这里的其他答案Object.keys.如果你没有能力或想要改变对象的序列化,他们也应该完成你想要的.