Подтвердить что ты не робот

Javascript: array.length возвращает undefined

У меня есть набор данных, передаваемый функцией 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. Что не так и как я могу это исправить?

4b9b3361

Ответ 1

Объекты не имеют свойства .length.

Простое решение, если вы знаете, что вам не нужно беспокоиться о проверках hasOwnProperty, должно было бы сделать это:

Object.keys(data).length;

Если вам нужно поддерживать IE 8 или ниже, вам придется использовать цикл, вместо этого:

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

Ответ 2

Один из вариантов:

Object.keys(myObject).length

К сожалению, это не работает в старых версиях IE (до 9).

Если вам нужна эта совместимость, используйте мучительную версию:

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

Ответ 3

Похоже, что это не массив, а произвольный объект. Если у вас есть контроль над сериализацией PHP, вы можете изменить это.

Как raina77ow указал, один из способов сделать это в PHP будет заменено что-то вроде этого:

json_encode($something) 

с чем-то вроде:

json_encode(array_values($something))

Но не игнорируйте другие ответы здесь о Object.keys. Они также должны выполнить то, что вы хотите, если у вас нет возможности или желания изменить сериализацию вашего объекта.

Ответ 4

попробуйте это

Object.keys(data).length

Если IE < 9, вы можете прокручивать объект самостоятельно с помощью цикла цикла

var len = 0;
var i;

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