Цикл через массив внутри объекта в Javascript

Возможный дубликат:
Цикл через объект Json

{
  "data": [
    {
      "name": "Jen",
      "id": "1"
    },
    {
      "name": "Steve",
      "id": "8"
    }
  ]
}

Сервер, с которым я взаимодействую, отвечает указанным выше образом.

Я пытаюсь пройти через itenter code here для оператора For..in.

Вот что я пытаюсь сделать:

for (var item in response.data) {
  console.log(item.name);
}

Это не работает. Что пошло не так?

Спасибо

Я ДОЛЖЕН поработать со следующим после прочтения комментария:

for (var item in response.data) {
  console.log(response.data[item].name);
}

Мне удалось получить список имен ...

Может ли кто-нибудь проанализировать ответ, почему это сработало?


person William Sham    schedule 24.02.2012    source источник
comment
Вы уверены, что это JavaScript, а не JSON?   -  person james_womack    schedule 24.02.2012
comment
Не подходящий дубликат. Это структура объекта, отличная от связанной.   -  person Michael Berkowski    schedule 24.02.2012
comment
Не дубликат этого вопроса! Он зацикливается на массиве!   -  person hugomg    schedule 24.02.2012
comment
Сколько раз мы можем спрашивать, как перебирать массивы / объекты в StackOverflow. Готов поспорить, что это уже сотый раз; действительно вижу: google.com/ И вы уверены, что это Javascript, а не комментарий JSON? Вы знаете, что означает JSON?   -  person Dexygen    schedule 24.02.2012
comment
@GeorgeJempty - О JSON, что вы имеете в виду? JSON не является частью JavaScript, он просто выглядит как он ... Различие между объектами JavaScript и JSON жизненно важно для любого использования ...   -  person nnnnnn    schedule 24.02.2012
comment
см. мой ответ на этот вопрос для хорошего объяснения: stackoverflow.com/questions/9415851/   -  person ckozl    schedule 24.02.2012
comment
JSON расшифровывается как Javascript Object Notation. Это подмножество буквального обозначения объекта Javascript. Достаточно сказано.   -  person Dexygen    schedule 24.02.2012


Ответы (3)


Проверьте: Почему использование for ... in с итерацией массива - плохая идея?

For ... in выполняет итерацию по именам свойств объекта. Элементы массива также считаются «свойствами», поэтому for..in выполняет итерацию по индексам (которые в вашем случае равны 0, 1). Как и ожидалось, когда вы используете response.data [0], вы получаете первый элемент вашего массива.

person Alexei Levenkov    schedule 24.02.2012
comment
Спасибо ! Вы ответили на мой вопрос! - person William Sham; 24.02.2012

data на самом деле является массивом (обозначается []), а не объектом, поэтому вам нужен обычный for цикл, а не for in.

for (var i = 0; i<response.data.length; i++) {
  // use i as an array index
  console.log(response.data[i].name);
}

В JavaScript конструкция for in используется для перебора свойств объекта, но для перебора массива обычно используется инкрементный цикл for.

person Michael Berkowski    schedule 24.02.2012
comment
Мне удалось заставить вышеуказанный формат работать. Мне просто было любопытно, как это сделать с For..in, но спасибо! Это подтверждает меня - person William Sham; 24.02.2012

for..in выполняет итерацию по перечислимым свойствам объекта в произвольном порядке (вы можете получить другой порядок в разных браузерах). Массив - это простой объект со специальным методом длины и удобными методами, унаследованными от Array.prototype (некоторые из которых зависят от специального свойства длины). Нет ограничений на то, что можно использовать для имени свойства, они не ограничиваются неотрицательными целыми числами (отмечая, что если правильное имя не является допустимым идентификатором, для доступа к его значению необходимо использовать запись в квадратных скобках).

Индексы массива - это просто имена строковых свойств (т.е. они просто имена свойств объектов), которые являются неотрицательными целыми числами, поэтому цикл for..in будет перебирать числовые индексы (опять же, не обязательно в порядке возрастания или убывания) а также все другие перечислимые свойства, в том числе в [[Prototype]] цепочке. Поэтому всегда рекомендуется включать тест hasOwnProperty с for..in, если вы не хотите включать унаследованные перечислимые свойства.

Из-за вышеизложенного, как правило, гораздо лучше перебирать свойства массива, используя счетчик от 0 до array.length - 1 (поскольку длина всегда на единицу больше, чем последний индекс).

Чтобы проверить выражение «без определенного порядка», попробуйте следующее в IE и другом браузере и обратите внимание на другой порядок:

var a = [];
a[2] = 2;
a[0] = 0;
a[3] = 3;
var b = [];
for (var i in a) b.push(a[i]);
alert(b);
person RobG    schedule 24.02.2012