Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript : array.length returns undefined

I have a set of data that is being passed on by the PHP's json_encode function. I'm using the jQuery getJSON function to decode it:

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

The output looks like this in the console:

Object {1: Object, 2: Object, 3: Object, 4: Object, 5: Object, 6: Object, 7: Object, 8: Object, 9: Object, 10: Object}

I can access each array by using data[1], data[2] etc, but to make it easier I thought of looping thought it so I can access all at once:

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

However I can't get this to work because the data.length returns the value undefined. What is wrong and how can I fix it?

like image 861
rksh Avatar asked Feb 04 '14 12:02

rksh


3 Answers

Objects don't have a .length property.

A simple solution if you know you don't have to worry about hasOwnProperty checks, would be to do this:

Object.keys(data).length;

If you have to support IE 8 or lower, you'll have to use a loop, instead:

var length= 0;
for(var key in data) {
    if(data.hasOwnProperty(key)){
        length++;
    }
}
like image 193
Cerbrus Avatar answered Nov 07 '22 07:11

Cerbrus


One option is:

Object.keys(myObject).length

Sadly it not works under older IE versions (under 9).

If you need that compatibility, use the painful version:

var key, count = 0;
for(key in myObject) {
  if(myObject.hasOwnProperty(key)) {
    count++;
  }
}
like image 28
ragklaat Avatar answered Nov 07 '22 06:11

ragklaat


It looks as though it's not an array but an arbitrary object. If you have control over the PHP serialization, you might be able to change that.

As raina77ow pointed out, one way to do this in PHP would be by replacing something like this:

json_encode($something) 

with something like:

json_encode(array_values($something))

But don't ignore the other answers here about Object.keys. They should also accomplish what you want if you don't have the ability or the desire to change the serialization of your object.

like image 7
Scott Sauyet Avatar answered Nov 07 '22 05:11

Scott Sauyet