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.