Цикл 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);
   }
}

Але я чомусь отримую лише першу частину, значення 1.

Будь-які ідеї?


Чи є якісь відсутні дужки? Зараз він не схожий на масив. А ти розбирав JSON?
Denys Séguret

це масив об’єктів? (ви пропали [] чи їх там немає?)
lpiepiora

9
Це ні JSON, ні масив.
JJJ

3
Можливий дублікат Loop через масив у JavaScript
Heretic Monkey

Будь ласка, змініть заголовок, це повторити через властивості об’єкта 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, він не працює.
mpoletto

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 = 0; i < array.length; i += 1)

Хоча тест на хром мав такий результат

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()

Принаймні, у хромі 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

Посилання


2
-1 - for ... in петлі не слід використовувати для масивів
Ерік

Використання розуміння масиву 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/


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, відокремлені комою. Якби вони обоє були у масиві ( [...]), це матиме більше сенсу.

І якщо вони знаходяться всередині масиву, то ви просто використовуєте стандартний цикл типу "для var i = 0 ...". Як і є, я думаю, що це буде спробувати відновити властивість "id" рядка "1", потім "id" "hi" тощо.


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));


0

о мій ... чому всі роблять це так важко !!?

ваш фрагмент даних потрібно трохи розширити, і він повинен бути таким чином, щоб бути належним json. зауважте, я просто включаю атрибут імені масиву "item"

{"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];
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.