Soru Nesne özellikleri ile yineleyin


var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    alert(propt + ': ' + obj[propt]);
}

Değişken nasıl propt nesnenin özelliklerini temsil eder? Bu yerleşik bir yöntem veya özellik değil. O zaman neden nesnedeki her özellik ile ortaya çıkıyor?


1520
2017-11-29 14:30


Menşei


if (typeof(obj[propt]) === 'object') {/* Tekrar yap */ } - noob
Peki, bu soru için gerçekten üzgünüm. Bir döngünün ne olduğunu biliyorum, şimdi kafamın "nesne özellikleriyle döngü içinde" olduğunu anlayamadım, ki şimdi temizlendiğini düşünüyorum. Ayrıca, bana "Adım Adım 2. Baskı Adım Adım - Steve Suehring okulda tavsiye ettiler. - Rafay
Bu iyi bir dilenci sorusu. Diğer dillerle 15 yıllık mesleki deneyimim olduğunu ekledim ve bu cevaba ihtiyacım vardı. Yapabilirsem 2000 kazanırdım. - Nathan C. Tresch
Çılgın, ama bunu nasıl yapacağımın sözdizimini yeniden öğrenmek için yıllardır her birkaç ayda bir bu sayfaya geliyorum. Bunu nasıl yapacağımı hatırlamıyorum ... Sadece bu sayfanın her zaman SO üzerinde olduğunu hatırlıyorum. - HDave
Bu StackOverflow'da gördüğüm en garip sayfa. Soruyu dikkatlice okursanız, sadece bir cevap aslında sorulan sorulara cevap vermeye teşebbüs eder ve -6 puan alır. Kabul edilen en yüksek puanlama cevabı sadece cevap vermekle kalmaz, aynı zamanda yanlıştır.


Cevaplar:


Özelliklerin yinelenmesi bu ek gerektirir hasOwnProperty Kontrol:

for (var property in object) {
    if (object.hasOwnProperty(property)) {
        // do stuff
    }
}

Bu, bir nesnenin prototipinin, nesnenin teknik olarak nesnesi olan nesne için ek özellikler içerdiğinden gereklidir. Bu ek özellikler temel nesne sınıfından miras alınır, ancak yine de object.

hasOwnProperty basitçe, bu sınıfa özgü bir özellik olup olmadığını ve temel sınıftan miras alınmadığını kontrol eder.


2055
2018-05-24 12:38



@B T göre Mozilla belgeleri: "Yalnızca nesnenin kendisine eklenen özellikleri ve prototiplerini göz önünde bulundurmak istemiyorsanız, getOwnPropertyNames kullanın veya hasOwnProperty kontrolünü gerçekleştirin(propertyIsEnumerable da kullanılabilir). " - davidmdem
Tam olarak çağrı noktası nedir object.hasOwnProperty()? Aslında öyle değil mi property onun değeri ne olursa olsun object? - Alex S
Çünkü, Alex S, bir nesnenin prototipi, nesnenin teknik olarak nesnesi olan nesne için ek özellikler içerir. Temel nesne sınıfından miras alınıyorlar, ama yine de özellikler. hasOwnProperty, bunun, bu sınıfa özgü bir özellik olup olmadığını ve temel sınıftan miras alınmadığını kontrol eder. İyi bir açıklama: brianflove.com/2013/09/05/javascripts-hasownproperty-method - Kyle Richter
Bununla birlikte, Object.keys (obj) nesnesinin kendisinin anahtarlarını almak için çok daha iyi bir çözüm olduğunu belirtmem gerektiğini hissediyorum. Mozilla belgelerine bağlantı: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Kyle Richter
Önemli bir bilgi parçası eksik. property burada bir dizedir, çağrılmalıydı propertyName. Aksi takdirde, benim gibi JS yeni başlayanlar için karışıklığa neden olabilir, yani ne yapmalı? if. - Neolisk


JavaScript 1.8.5'ten itibaren kullanabilirsiniz Object.keys(obj) Nesnenin kendisinde tanımlanmış bir özellik dizisi elde etmek için ( obj.hasOwnProperty(key)).

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

Bu, bir for-in döngü kullanmaktan daha iyidir (ve daha okunabilir).

Bu tarayıcılarda destekleniyor:

  • Firefox (Gecko): 4 (2,0)
  • Krom: 5
  • Internet Explorer: 9

Görmek Mozilla Geliştirici Ağı Object.keys ()referansı daha fazla bilgi için.


775
2017-08-13 07:19



Bu şimdi daha yaygın olarak destekleniyor: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Dom Vinyard
Eski tarayıcılar için desteğe ihtiyacınız varsa, bunu kullanabilirsiniz polyfill - KyleMit
Bu dil yapısını destekleyen ortamlarda, bu yöntem Array.foreach çağrısına izin verir: Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object }); - Todd Price
Güzel çözüm. Ama yineleme nasıl kırılır? - AJ_83
@ AJ_83 Bir forEach () öğesinden kurtulmanın iyi bir yolu yoktur. Bu durumda bazı () 'i kullanın ve mola vermek için true değerini döndürün - Daniel Ziegler


Bu for...in statement (MDN, ECMAScript bilgisi).

Onu okuyabilirsin "İÇİN her mülk İÇİNDE  obj nesne, her özelliği PROPT sırayla değişken ".


190
2017-11-29 14:32



@RightSaidFred ile katılıyorum, in operatör ve for ifade hiç de dahil değil for-in Beyan kendi başına bir dilbilgisi üretimini temsil eder: for ( LeftHandSideExpression in Expression ), for ( var VariableDeclarationNoIn in Expression ) - CMS
Bu cevabın o kadar çok oyu var, özellikle de bu popüler yorumlar onunla çelişiyor gibi görünüyor. - Doug Molineux
Bu neden cevap olarak işaretlendi? Bu iş parçacığı muhtemelen en az yararlı olanıdır. - computrius
@PeteHerbertPenito, kimse cevabını düzenlemek için rahatsız olmadı yaptım. - Dan Dascalescu
En az yardımcı cevap? OP'nin sorduğunu düşündüğünüz şeye bağlıdır; soruyu ilk okuduğumda, bir nesnenin özelliklerini incelemek için bir değişkenin kullanılabileceği mekanizma hakkında şaşkın bir eğlenceye benziyordu. bu Cevap, açık bir şekilde açıklamaktadır (buna rağmen “yanlış” kelimesini). “Neden her özellik ile ortaya çıkıyor” sorusu, OP'nin hasOwnProperty'yi aradığını, ancak bunu bilmediğini, ancak bunun daha muhtemel olduğunu düşündürüyordu. bu OP'nin bilmek istediği şeydi ve farklı bir soruya doğru bir cevabı yanlış bir şekilde kabul etti. :-) - Bumpy


Kızlar ve erkekler bizler 2017'deyiz ve yazmak için çok fazla zamanımız yok ... Bu harika yeni ECMAScript 2016'yı yapalım:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));

144
2017-11-22 08:47



Bu Danny R'nin cevabından farklı mı? - krillgar
Bir oneliner ve forEach yerine map kullanıyor. Ve ayrıca konsol.log oturumu bazı insanlar için ilginç olabilir. - Frank Roth
Bu snippet'i doğrudan kopyalamıyor ve konsol günlüğü iletinizin neden bir dize olarak ele alındığını merak ediyorsanız, tek tırnak işareti (') xD yerine backticks (`) kullanmayı unutmayın. - kayleeFrye_onDeck
2 karakter daha kaydetmek isterseniz, ()etrafında e argüman ... Object.keys(obj).map(e => console.log(`key=${e} value=${obj[e]}`)) - Grant
forEach burada daha uygun. map() Verileri dönüştürmek ve döndürülen değeri kullanmak istediğinizde daha uygundur map(). Kullanırken forEach Yalnızca yan etkiler için yinelendiğiniz ve dönüşüm için değil, açık olduğunuzdan eminiz. - Ski


ES'nin yaklaşan sürümlerinde kullanabilirsiniz Object.entries:

for (const [key, value] of Object.entries(obj)) { }

veya

Object.entries(obj).forEach(([key, value]) => ...)

Değerleri tekrarlamak istiyorsanız, Object.values ​​kullanın:

for (const value of Object.values(obj)) { }

veya

Object.values(obj).forEach(value => ...)

58
2017-09-13 06:41



Bu en iyi çözüm olurdu (object.entries ...), ama kullanamam. Bunu birden çok kez yapmak ve çerçevenizde destekleyemediğinizde, bu sayfada çok amaçlı doldurmayı kullanabilirsiniz: developer.mozilla.org/nl/docs/Web/JavaScript/Reference/... - Mario
Üçüncü öneri, yalnızca özelliklerin değerleri için mükemmeldir. Korku veren! - gnzg


Bu sadece bir for...in döngü. Çıkış yapmak Mozilla'daki belgeler.


37
2017-11-29 14:33



Bu, atadığınız liyakate layık olan, kendi başına değil, oldukça basit bir ayrımdır. Bu, orijinal soruya bağlam ve uygulama eksik olan kötü yazılmış bir cevaptır. - FlavorScape
Bu cevap hala, soruya cevap vermeyen cevapların çoğundan daha iyidir. - developerbmw


jquery bunu şimdi yapmanızı sağlar:

$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

20
2018-03-29 15:19



$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)}) $ .each uygun değil nesneler için. Bir nesnenin bir uzunluk özelliğine sahip olması ve değerinin sıfır olması durumunda, tüm nesne boş bir dizi gibi ele alınır. - Bob Stein
ayrıntılar neden bence bu bir hata getiren yaklaşım. - Bob Stein