Orijinal soruya yanıt olarak for/in
yanlış kullanıyorsunuz . Kodunuzda key
dizin 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/in
ilk etapta yapmamalısınız .
Özet (Ara 2018'de eklendi)
for/in
Bir 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/of
nodeList
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 HTMLCollection
veya nodeList
nesnenin her ikisinin de for/in
yinelemeyle 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 length
ve item
özelliklerini de alır . for/in
Yineleme 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/in
yinelemeniz ş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 ve0
1
2
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 NodeList
ve an ile birlikte / of construct için HTMLCollection
yalnı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.iterator
Chrome 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 nodeList
olduğu gibi çalışır document.querySelectorAll()
, ancak HTMLCollection
olduğ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/of
sözdiziminin sonucunu kullanabilirsiniz .
Ben de hem jsFiddle hem de ayrı ayrı test eder HTMLCollection
ve nodeList
çıktı jsFiddle kendisi yakalar.
ES6 için Mart 2018'de Dördüncü Güncelleme
Mesqueeeb Başına, Symbol.iterator
destek 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 HTMLCollection
ile yineleme desteği for/of
2018 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/of
hem HTMLCollection hem de NodeList nesnelerinin yinelenmesi için yerel destek içerir .