Perulangan JavaScript melalui json array?

151

Saya mencoba untuk mengulang melalui json array berikut:

{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "[email protected]"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "[email protected]"
}

Dan sudah mencoba yang berikut ini

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

Tetapi untuk beberapa alasan saya hanya mendapatkan bagian pertama, nilai id 1.

Ada ide?

Alosyius
sumber
Apakah ada tanda kurung yang hilang? Itu tidak benar-benar terlihat seperti array, sekarang. Dan apakah Anda mengurai JSON?
Denys Séguret
apakah itu array objek? (apakah Anda hilang [] atau tidak ada di sana?)
lpiepiora
9
Ini bukan JSON atau array.
JJJ
3
Kemungkinan duplikat Loop melalui array di JavaScript
Heretic Monkey
Silakan ubah judul, ini untuk beralih melalui properti objek JSON, bukan array
Situs Web Taylored

Jawaban:

222

JSON Anda akan terlihat seperti ini:

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

Anda dapat mengulang Array seperti ini:

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

    console.log(obj.id);
}

Atau seperti ini (disarankan dari Eric) hati-hati dengan dukungan IE

json.forEach(function(obj) { console.log(obj.id); });
Niklas
sumber
11
Atau lebih ringkasnya,json.forEach(function(obj) { console.log(obj.id); });
Eric
4
Kecuali pada IE8 (seperti biasa, semua orang kecuali IE;))
lpiepiora
4
Saya pikir contoh itu dapat membingungkan, karena var json bukan objek JSON, tetapi sebuah array. Dalam kasus ini, .forEach bekerja dengan baik, tetapi ketika Anda menggunakan objek json, itu tidak berfungsi.
mpoletto
27

Ada beberapa masalah dalam kode Anda, pertama json Anda harus terlihat seperti:

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

Selanjutnya, Anda dapat mengulangi seperti ini:

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

Dan itu memberikan hasil yang sempurna.

Lihat biola di sini: http://jsfiddle.net/zrSmp/

Kesatria Kegelapan
sumber
16
var arr = [
  {
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "[email protected]"
  }, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "[email protected]"
  }
];

Metode forEach untuk implementasi yang mudah.

arr.forEach(function(item){
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});
Sivanesh S
sumber
16

coba ini

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

json.forEach((item) => {
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});
chirag sorathiya
sumber
10

Karena saya sudah mulai mencari ke dalamnya:

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

Dan fungsi ini

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

Anda bisa menyebutnya seperti ini

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

Perbarui setelah komentar Erics

Sebagai eric menunjukkan sebuah for inloop untuk sebuah array dapat memiliki hasil yang tidak diharapkan . Pertanyaan yang dirujuk memiliki diskusi panjang tentang pro dan kontra.

Uji dengan untuk (var ...

Tetapi tampaknya follwing ini cukup hemat:

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

Meskipun tes di chrome memiliki hasil sebagai berikut

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

Tes dengan .forEach()

Setidaknya di chrome 30 ini berfungsi seperti yang diharapkan

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

Tautan

surfmuggle
sumber
2
-1 - for ... in loop tidak boleh digunakan untuk array
Eric
Penggunaan array array for each. for ... in ...adalah konstruksi bahasa untuk enumerasi kunci objek dalam urutan acak. Itu bukan konstruksi yang tepat untuk sebuah array.
Eric
9

Ini bekerja. Saya baru saja menambahkan tanda kurung siku ke data JSON. Datanya adalah:

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

Dan loopnya adalah:

for (var key in data) {
   if (data.hasOwnProperty(key)) {
         alert(data[key].id);
   }
} 
Shyam Shinde
sumber
6

Ini harus berupa array jika Anda ingin mengulanginya. Anda kemungkinan besar hilang [dan ].

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

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

Lihat jsfiddle ini: http://jsfiddle.net/lpiepiora/kN7yZ/

lpiepiora
sumber
5

Agak terlambat tapi saya harap saya bisa membantu orang lain: D

json Anda perlu terlihat seperti sesuatu yang sudah dikatakan Niklas. Dan kemudian di sini Anda pergi:

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

jika Anda memiliki array Multidimensi, ini adalah kode Anda:

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]);
            }
       }
}
Kami Yang
sumber
3

Yah, yang bisa saya lihat di sana adalah bahwa Anda memiliki dua objek JSON, dipisahkan oleh koma. Jika keduanya berada di dalam array ( [...]) itu akan lebih masuk akal.

Dan, jika mereka ADA di dalam array, maka Anda hanya akan menggunakan jenis loop "for var i = 0 ..." standar. Seperti itu, saya pikir itu akan mencoba untuk mengambil properti "id" dari string "1", lalu "id" dari "hai", dan seterusnya.

Katana314
sumber
2

Solusi singkat menggunakan mapdan fungsi panah

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

Dan untuk menutup kasus-kasus ketika properti "id"tidak ada, gunakan filter:

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

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

pengguna2314737
sumber
0

oh my ... mengapa semua orang membuat ini sangat sulit !!?

cuplikan data Anda perlu diperluas sedikit, dan harus dengan cara ini menjadi json yang tepat. perhatikan saya hanya memasukkan atribut array name "item"

{"item":[
{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "[email protected]"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "[email protected]"
}]}

skrip java Anda sederhana

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Robb Penoyer
sumber