Prototip kullanarak javascript'teki bir nesnenin her özelliğini yinelemek mi?


89

Prototip JavaScript çerçevesini kullanarak bir nesnenin her özelliğini yinelemenin bir yolu var mı?

Durum şu: JSON'da şuna benzer bir AJAX yanıtı alıyorum:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Bir değişkene verilen json yanıtını değerlendirirsem, hangi dizinlerin doğru ve hangilerinin yanlış olduğunu görmek responseiçin response.barobjnesnedeki her bir özelliği yinelemek isterim .

Prototip her ikisine de sahip Object.keys()ve Object.values()ama garip bir şekilde basit bir Object.each()işlevi yok gibi görünüyor ! Object.keys () ve Object.values ​​() sonuçlarını alıp, birini yinelediğim için diğerine çapraz referans verebilirim, ancak bu öyle bir hack'tir ki, bunu yapmanın uygun bir yolu olduğundan eminim!

Yanıtlar:


42

Önce nesnenizin değişmez değerini Prototip Hash'e dönüştürmeniz gerekir :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Mükemmel! Tam olarak aradığım buydu.
OverloadUT

57
Ne yazık ki, Prototip olmadan basit bir javascript nesnesi üzerinde yinelemek isteyen benzer bir soru kapatıldığından, şimdi bu yanıtı "çoğaltma" nedeniyle kapatılan soruyla aynı gibi ele almalıyım. Yani, kullanıcıyı Prototip yüklemeye zorlayan korkunç bir örnek. Kullanıcı Prototip hakkında hiçbir şey söylemedi, bu yüzden onları istenmeyen bir kitaplık yüklemeye zorlamak işe yaramaz. (buna gerçekten bir kopya gibi davranmayı unutmayın). Diğer soru, yanlış çoğaltma iddiası nedeniyle kapatılmamış olsaydı, yanıtı olumsuz oylamam gerekmezdi.

2
Soru soran kişi Prototip istediğinden bahsetmedi mi (yoksa soru düzenlendi mi?)? Her neyse her şey
yolunda

Harici bir kitaplık yüklemeye gerek yok
Healkiss

553

Burada Prototip'e gerek yok: JavaScript'te for..indöngüler var. Kimsenin uğraşmadığından emin değilseniz Object.prototype, kontrol edin hasOwnProperty(), örn.

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Bizi istenmeyen bir kitaplığı yüklemeye zorlamadan gerçek yanıt için teşekkür ederiz.

8
bu doğru cevap değil. sorular prototipin kullanılması gerektiğini belirtir! seçim özgürlüğü - haha ​​...
Sven Larson

1
Bu sorunun orijinal başlığı, açıklık için tekrar eklediğim Prototip'ten bahsetti. Bu soru, vücudun ilk çizgisinin kanıtladığı gibi, özellikle Prototipin kullanımda olduğu bir ortamı soruyordu.
OverloadUT

1
Ne kadar çok Javascript yazarsan, fordöngüleri yazmaktan o kadar nefret edeceksin :)
Triptych

13
Ne yazık ki, Google'da "her nesne özelliği javascript üzerinde nasıl yinelenir" gibi bir şey için 1 numara olarak ortaya çıkan soru budur, bu nedenle buraya gelen birçok insan muhtemelen bu sorunun cevabını arıyor. İstedikleri soru şudur: stackoverflow.com/questions/921789/… , ki bu gerçekten nesne değişmezleriyle ilgisi yoktur.
Baxissimo

0

Anahtarları yinelemeli ve köşeli parantez kullanarak değerleri almalısınız.

Bakınız: Bir javascript nesnesinin özelliklerini nasıl sıralayabilirim?

DÜZENLEME: Açıkçası, bu soruyu bir kopya yapar.


Prototip belgelerinde bu yöntemin kullanılması kesinlikle önerilmez: prototypejs.org/api/array
OverloadUT

1
Ayrıca, bunun bir kopya olduğunu sanmıyorum çünkü sahip olduğum şey olan bir Prototip yerel çözüm arıyordum. Diğer soru, bir çerçeve kullanmasını istemeyen biri için makul, ancak Prototip kullanıyorsanız bu çözüm çok daha güvenli.
OverloadUT

1
@OverloadUT: Yeterince dikkatli okumadınız: düz nesnelerin değil, dizilerin özelliklerini yinelemeniz önerilmez
Christoph
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.