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": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}

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?


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


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": "hello1@email.se"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}];

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

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": "hello1@email.se"
},
{
"id" : "2", 
"msg"   : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "hello2@email.se"
}];

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/


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"
  }
];

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

16

coba ini

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

Karena saya sudah mulai mencari ke dalamnya:

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"
}]

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


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": "hello1@email.se" 
    }, 
    { 
        "id": "2", 
        "msg": "there", 
        "tid": "2013-05-05 23:45", 
        "fromWho": "hello2@email.se"
    }
]

Dan loopnya adalah:

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

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": "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);
}

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


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

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.


2

Solusi singkat menggunakan mapdan fungsi panah

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

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": "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

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": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}]}

skrip java Anda sederhana

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.