JavaScript dizisi üzerinden JavaScript döngü?


151

Aşağıdaki json dizi üzerinden döngü çalışıyorum:

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

Ve aşağıdakileri denedim

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

Ama nedense ben sadece ilk kısmı, id 1 değerleri alıyorum.

Herhangi bir fikir?


Eksik parantez var mı? Şimdi gerçekten bir dizi gibi görünmüyor. Ve JSON'u ayrıştın mı?
Denys Séguret

bir nesne dizisi mi? (eksik mi [] veya orada değiller mi?)
lpiepiora

9
Ne JSON ne de dizi.
JJJ


Lütfen başlığı değiştirin, bu bir dizi değil bir JSON nesnesi özellikleri üzerinden yineleme yapmak için
Taylored Web Sitesİ

Yanıtlar:


222

JSON'unuz şöyle görünmelidir:

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

Dizi üzerinde şu şekilde döngü yapabilirsiniz:

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

    console.log(obj.id);
}

Ya da böyle (Eric tarafından önerilen) IE desteğine dikkat edin

json.forEach(function(obj) { console.log(obj.id); });

11
Veya daha kısaca,json.forEach(function(obj) { console.log(obj.id); });
Eric

4
IE8 üzerinde sürece (her zamanki gibi, IE dışında herkes;))
lpiepiora

4
Ben var örnek bir JSON nesnesi değil, bir dizi olduğundan, bu örnek karıştırılabilir düşünüyorum. Bu durumda, .forEach iyi çalışır, ancak bir json nesnesi kullandığınızda işe yaramaz.
mpoletto

27

Kodunuzda birkaç sorun var, önce json'unuz şöyle görünmelidir:

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

Sonra, bu şekilde tekrarlayabilirsiniz:

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

Ve mükemmel sonuç verir.

Buradaki kemanı görün: 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"
  }
];

Kolay uygulama için her yöntem.

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

bunu dene

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

Zaten içine bakmaya başladığımdan beri:

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

Ve bu fonksiyon

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

Buna şöyle diyebilirsiniz

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

Erics yorum yaptıktan sonra güncelleme

As Eric işaret bir for inbir dizi için döngü beklenmedik sonuçları olabilir . Referans verilen sorunun artıları ve eksileri hakkında uzun bir tartışması var.

İle test (var i ...

Ama şu ki, follwing oldukça tasarruflu:

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

Her ne kadar krom testinde şu sonuç elde edilmiş olsa da

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

İle test et .forEach()

En azından krom 30'da bu beklendiği gibi çalışıyor

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

Bağlantılar


2
-1 - for ... in döngüler diziler için kullanılmamalıdır
Eric

Dizi kavrayışı kullanımı for each. for ... in ...nesne anahtarlarını rastgele sırada numaralandırmak için kullanılan bir dil yapısıdır. Bu bir dizi için doğru yapı değildir.
Eric

9

Çalışıyor. Az önce JSON verilerine köşeli parantez ekledim. Veriler:

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

Ve döngü:

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

6

Üzerinde yineleme yapmak istiyorsanız bir dizi olmalıdır. Büyük olasılıkla kayıp [ve ].

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

Bu jsfiddle göz atın: http://jsfiddle.net/lpiepiora/kN7yZ/


5

Biraz geç ama umarım başkalarına yardım edebilirim: D

Json'unuzun Niklas'ın zaten söylediği bir şeye benzemesi gerekiyor. Ve sonra işte gidiyorsunuz:

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

Çok Boyutlu bir diziniz varsa, bu kodunuzdur:

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

Gördüğüm tek şey, virgülle ayrılmış iki JSON nesneniz olması. Her ikisi de bir dizi ( [...]) içinde olsaydı daha mantıklı olurdu.

Ve eğer bir dizinin içindeyse, sadece standart "var i = 0 ..." tipi döngü kullanırsınız. Olduğu gibi, "1" dizesinin "id" özelliğini, sonra "hi" ve "id" almak için çalışacağını düşünüyorum.


2

Kullanarak kısa bir çözüm mapve bir ok fonksiyonu

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

Ve mülkün "id"mevcut olmadığı durumları kapsamak için kullanın 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 ... neden herkes bunu bu kadar zorlaştırıyor !!?

veri snippet'inizin biraz genişletilmesi gerekir ve uygun json olması için bu şekilde olması gerekir. Ben sadece dizi adı özniteliği "madde" dahil

{"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 betiğiniz basitçe

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.