Orijinal soruya yanıt olarak for/inyanlış kullanıyorsunuz . Kodunuzda keydizin var. Yani, sözde diziden değeri almak için yapmanız list[key]ve kimliği almanız gerekir list[key].id. Ancak, bunu for/inilk etapta yapmamalısınız .
Özet (Ara 2018'de eklendi)
for/inBir nodeList veya HTMLCollection öğesini yinelemek için hiçbir zaman kullanmayın . Bundan kaçınmanın nedenleri aşağıda açıklanmıştır.
Modern tarayıcıların tüm son sürümleri (Safari, Firefox, Chrome, Edge) destekliyor for/ofnodeList veya gibi DOM listelerinde yinelemeyiHTMLCollection .
İşte bir örnek:
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
Eski tarayıcıları (IE gibi şeyler dahil) dahil etmek için, bu her yerde çalışır:
var list= document.getElementsByClassName("events");
for (var i = 0; i < list.length; i++) {
console.log(list[i].id); //second console output
}
Neden Kullanmamanız Gerektiği Hakkında Açıklama for/in
for/in"" bir nesnenin özelliklerini yinelemek içindir. Bu, bir nesnenin tüm yinelenebilir özelliklerini döndüreceği anlamına gelir. Bir dizi için çalışıyor gibi görünse de (dönen elemanlar veya sözde dizi elemanları), nesnenin dizi benzeri elemanlardan beklediğiniz gibi olmayan diğer özelliklerini de döndürebilirsiniz. Ve bir HTMLCollectionveya nodeListnesnenin her ikisinin de for/inyinelemeyle döndürülecek başka özellikleri olabileceğini tahmin edin . Sadece Chrome'da bunu denedim ve yinelediğiniz şekilde yineledim, listedeki öğeleri (0, 1, 2, vb ...) alır, ancak lengthve itemözelliklerini de alır . for/inYineleme sadece bir HTMLCollection için çalışmaz.
Bkz. Http://jsfiddle.net/jfriend00/FzZ2H/Bir HTMLCollection'ı neden tekrarlayamamanız için adresinefor/in .
Firefox'ta for/inyinelemeniz şu öğeleri döndürür (nesnenin tüm yinelenebilir özellikleri):
0
1
2
item
namedItem
@@iterator
length
Umarım, şimdi neden kullanmak istediğinizi görebilirsiniz , for (var i = 0; i < list.length; i++)böylece elde edersiniz ve012 senin tekrarında.
Aşağıda, tarayıcıların 2015-2018 dönemi boyunca nasıl evrimleştiğinin bir evrimi vardır. Yukarıda açıklanan seçenekleri kullanabileceğiniz için modern tarayıcılarda bunlara artık gerek yoktur.
2015'te ES6 Güncellemesi
ES6'ya, Array.from()dizi benzeri bir yapıyı gerçek bir diziye dönüştürecek olan eklenir . Bu, kişinin doğrudan böyle bir liste numaralandırmasına izin verir:
"use strict";
Array.from(document.getElementsByClassName("events")).forEach(function(item) {
console.log(item.id);
});
Çalışan demo (Nisan 2016 itibariyle Firefox, Chrome ve Edge'de): https://jsfiddle.net/jfriend00/8ar4xn2s/
2016'da ES6 Güncellemesi
Artık ES6'yı a NodeListve an ile birlikte / of construct için HTMLCollectionyalnızca kodunuza ekleyerek kullanabilirsiniz:
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
Sonra şunları yapabilirsiniz:
var list = document.getElementsByClassName("events");
for (var item of list) {
console.log(item.id);
}
Bu, Chrome, Firefox ve Edge'in geçerli sürümünde çalışır. Bu, Array yineleyicisini hem NodeList hem de HTMLCollection prototiplerine eklediği için çalışır, böylece yinelendiğinde / yinelendiğinde bunları yinelemek için Array yineleyicisini kullanır.
Çalışma demosu: http://jsfiddle.net/jfriend00/joy06u4e/ .
Aralık 2016'da ES6 için İkinci Güncelleme
Aralık 2016 itibariyle, Symbol.iteratorChrome v54 ve Firefox v50'de destek sağlanmıştır , bu nedenle aşağıdaki kod kendi kendine çalışır. Edge için henüz yerleşik değil.
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
Çalışan demo (Chrome ve Firefox'ta): http://jsfiddle.net/jfriend00/3ddpz8sp/
Aralık 2017'de ES6 için Üçüncü Güncelleme
Aralık 2017 itibariyle, bu özellik Edge 41.16299.15.0'da nodeListolduğu gibi çalışır document.querySelectorAll(), ancak HTMLCollectionolduğu gibi değil , document.getElementsByClassName()bu nedenle yineleyiciyi Edge'de bir için kullanmak üzere manuel olarak atamanız gerekir HTMLCollection. Bir koleksiyon türünü neden düzelttikleri tam bir gizem, diğerini değil. Ancak, en azından Edge'in şu anki sürümlerinde document.querySelectorAll()ES6 for/ofsözdiziminin sonucunu kullanabilirsiniz .
Ben de hem jsFiddle hem de ayrı ayrı test eder HTMLCollectionve nodeListçıktı jsFiddle kendisi yakalar.
ES6 için Mart 2018'de Dördüncü Güncelleme
Mesqueeeb Başına, Symbol.iteratordestek yerleşik olan Safari de kullanabilirsiniz, böylece for (let item of list)biri için document.getElementsByClassName()veyadocument.querySelectorAll() .
ES6 için Nisan 2018'de Beşinci Güncelleme
Görünüşe göre, bir HTMLCollectionile yineleme desteği for/of2018 Sonbaharında Edge 18'e gelecek.
Kasım 2018'de ES6 için Altıncı Güncelleme
Microsoft Edge v18 (Sonbahar 2018 Windows Güncelleştirmesi'nde bulunan) ile artık hem HTMLCollection'ı hem de Edge for / ile birlikte bir NodeList'i yineleyebileceğinizi onaylayabilirim.
Bu nedenle, şimdi tüm modern tarayıcılar for/ofhem HTMLCollection hem de NodeList nesnelerinin yinelenmesi için yerel destek içerir .