JavaScript цикл через массив JSON?

151

Я пытаюсь перебрать следующий массив json:

{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}

И попробовал следующее

for (var key in data) {
   if (data.hasOwnProperty(key)) {
      console.log(data[key].id);
   }
}

Но по какой-то причине я получаю только первую часть, значения id 1.

Любые идеи?

Alosyius
источник
Есть ли пропущенные скобки? Сейчас это не похоже на массив. А вы разобрали JSON?
Денис Сегюре
это массив объектов? (ты
скучаешь
9
Это не JSON и не массив.
JJJ
3
Возможная
Еретик Обезьяна
Пожалуйста, измените заголовок, это должно повторять свойства объекта JSON, а не массив
Taylored Web Sites

Ответы:

222

Ваш JSON должен выглядеть так:

var json = [{
    "id" : "1", 
    "msg"   : "hi",
    "tid" : "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}];

Вы можете зациклить массив таким образом:

for(var i = 0; i < json.length; i++) {
    var obj = json[i];

    console.log(obj.id);
}

Или вот так (предложено Эриком) будьте осторожны с поддержкой IE

json.forEach(function(obj) { console.log(obj.id); });
Никлас
источник
11
Или более кратко,json.forEach(function(obj) { console.log(obj.id); });
Эрик
4
Если только на IE8 (как обычно, все, кроме IE;))
lpiepiora
4
Я думаю, что этот пример может сбить с толку, потому что var json - это не объект JSON, а массив. В этом случае .forEach работает хорошо, но когда вы используете объект json, он не работает.
Мполетто
27

В вашем коде есть несколько проблем, сначала ваш json должен выглядеть так:

var json = [{
"id" : "1", 
"msg"   : "hi",
"tid" : "2013-05-05 23:35",
"fromWho": "hello1@email.se"
},
{
"id" : "2", 
"msg"   : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "hello2@email.se"
}];

Далее вы можете выполнить итерацию следующим образом:

for (var key in json) {
if (json.hasOwnProperty(key)) {
  alert(json[key].id);
  alert(json[key].msg);
}
}

И это дает прекрасный результат.

Смотрите скрипку здесь: http://jsfiddle.net/zrSmp/

Темный рыцарь
источник
16
var arr = [
  {
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
  }, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
  }
];

Метод forEach для легкой реализации.

arr.forEach(function(item){
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});
Сиванеш С
источник
16

попробуй это

var json = [{
    "id" : "1", 
    "msg"   : "hi",
    "tid" : "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}];

json.forEach((item) => {
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});
чираг соратия
источник
10

Так как я уже начал изучать это:

var data = [{
    "id": "1",
    "msg": "hi",
    "tid": "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
}, {
    "id": "2",
    "msg": "there",
    "tid": "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}]

И эта функция

var iterateData =function(data){   for (var key in data) {
       if (data.hasOwnProperty(key)) {
          console.log(data[key].id);
       }
    }};

Вы можете назвать это так

iterateData(data); // write 1 and 2 to the console

Обновление после комментария Erics

Как Эриком отметил цикл для массива может привести к неожиданным результатам . В упомянутом вопросе долго обсуждаются плюсы и минусы.for in

Проверить с помощью for (var i ...

Но похоже, что следующее вполне спасло:

for(var i = 0; i < array.length; i += 1)

Хотя тест в Chrome имел следующий результат

var ar = [];
ar[0] = "a"; 
ar[1] = "b";
ar[4] = "c";

function forInArray(ar){ 
     for(var i = 0; i < ar.length; i += 1) 
        console.log(ar[i]);
}

// calling the function
// returns a,b, undefined, undefined, c, undefined
forInArray(ar); 

Тест с .forEach()

По крайней мере, в Chrome 30 это работает как ожидалось

var logAr = function(element, index, array) {
    console.log("a[" + index + "] = " + element);
}
ar.forEach(logAr); // returns a[0] = a, a[1] = b, a[4] = c

связи

surfmuggle
источник
2
-1 - for ... in циклы не должны использоваться для массивов
Eric
Использование массивов for each. for ... in ...является языковой конструкцией для перечисления ключей объекта в произвольном порядке. Это неправильная конструкция для массива.
Эрик
9

Это работает. Я просто добавил квадратные скобки к данным JSON. Данные:

var data = [
    { 
        "id": "1",
        "msg": "hi", 
        "tid": "2013-05-05 23:35", 
        "fromWho": "hello1@email.se" 
    }, 
    { 
        "id": "2", 
        "msg": "there", 
        "tid": "2013-05-05 23:45", 
        "fromWho": "hello2@email.se"
    }
]

И цикл такой:

for (var key in data) {
   if (data.hasOwnProperty(key)) {
         alert(data[key].id);
   }
} 
Шьям Шинде
источник
6

Это должен быть массив, если вы хотите перебрать его. Вы очень вероятно , отсутствует [и ].

var x = [{
    "id": "1",
        "msg": "hi",
        "tid": "2013-05-05 23:35",
        "fromWho": "hello1@email.se"
}, {
    "id": "2",
        "msg": "there",
        "tid": "2013-05-05 23:45",
        "fromWho": "hello2@email.se"
}];

var $output = $('#output');
for(var i = 0; i < x.length; i++) {
    console.log(x[i].id);
}

Проверьте это jsfiddle: http://jsfiddle.net/lpiepiora/kN7yZ/

lpiepiora
источник
5

Немного поздно, но я надеюсь, что могу помочь другим: D

Ваш JSON должен выглядеть так, как уже сказал Никлас. И тогда вы идете:

for(var key in currentObject){
        if(currentObject.hasOwnProperty(key)) {
          console.info(key + ': ' + currentObject[key]);
        }
   }

если у вас есть многомерный массив, это ваш код:

for (var i = 0; i < multiDimensionalArray.length; i++) {
    var currentObject = multiDimensionalArray[i]
    for(var key in currentObject){
            if(currentObject.hasOwnProperty(key)) {
              console.info(key + ': ' + currentObject[key]);
            }
       }
}
Ками Ян
источник
3

Ну, все, что я могу видеть, это то, что у вас есть два объекта JSON, разделенных запятой. Если бы они оба были внутри array ( [...]), это имело бы больше смысла.

И, если они находятся внутри массива, то вы бы просто использовали стандартный цикл «для var i = 0 ...». На самом деле, я думаю, что он попытается получить свойство «id» для строки «1», затем «id» для «hi» и так далее.

Katana314
источник
2

Краткое решение с mapиспользованием функции стрелки

var data = [{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}];
data.map((item, i) => console.log('Index:', i, 'Id:', item.id));

И для покрытия случаев, когда собственности "id"нет, используйте filter:

var data = [{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}, {
  "msg": "abcde",
  "tid": "2013-06-06 23:46",
  "fromWho": "hello3@email.se"
}];

data.filter(item=>item.hasOwnProperty('id'))
                .map((item, i) => console.log('Index:', i, 'Id:', item.id));

user2314737
источник
0

о боже ... почему все делают это так сложно !!?

Ваш фрагмент данных должен быть немного расширен, и это должно быть так, чтобы быть правильным JSON. обратите внимание, я просто включаю атрибут имени массива "элемент"

{"item":[
{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}]}

ваш сценарий Java просто

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Робб Пенойер
источник