Iterasi atas setiap properti objek dalam javascript menggunakan Prototipe?

89

Apakah ada cara untuk mengulang setiap properti objek menggunakan kerangka JavaScript Prototipe?

Inilah situasinya: Saya mendapatkan respons AJAX di JSON yang terlihat seperti ini:

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

Jika saya mengevaluasi respons json itu ke dalam suatu variabel response, saya ingin dapat mengulang setiap properti di response.barobjobjek untuk melihat indeks mana yang benar dan mana yang salah.

Prototipe memiliki keduanya Object.keys()dan Object.values()anehnya tampaknya tidak memiliki Object.each()fungsi yang sederhana ! Saya dapat mengambil hasil dari Object.keys () dan Object.values ​​() dan melakukan referensi silang yang lain saat saya mengulanginya satu per satu, tetapi itu adalah peretasan yang saya yakin ada cara yang tepat untuk melakukannya!

OverloadUT
sumber

Jawaban:

42

Anda harus terlebih dahulu mengonversi literal objek Anda ke Prototipe Hash :

// 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);
});
Triptych
sumber
Sempurna! Inilah yang saya cari.
OverloadUT
57
Sayangnya karena pertanyaan serupa ditutup, pertanyaan yang hanya ingin mengulang objek javascript sederhana tanpa Prototipe, saya sekarang harus memperlakukan jawaban ini seolah-olah sama dengan pertanyaan yang ditutup karena "duplikasi". Jadi, contoh mengerikan karena memaksa pengguna untuk memuat Prototipe. Pengguna tidak mengatakan apa-apa tentang Prototipe sehingga memaksa mereka untuk memuat pustaka yang tidak diinginkan tidak berguna. (ingat, perlakukan ini seolah-olah itu benar-benar duplikat). Jika pertanyaan lain tidak ditutup karena klaim duplikasi palsu, saya tidak perlu memberikan suara untuk jawabannya.
2
Bukankah penanya menyebutkan bahwa mereka menginginkan Prototipe (atau pertanyaannya diedit?)? Pokoknya semuanya baik
emurano
Tidak perlu memuat perpustakaan eksternal
Healkiss
553

Prototipe tidak diperlukan di sini: JavaScript memiliki for..inloop. Jika Anda tidak yakin tidak ada yang mengacaukannya Object.prototype, periksa hasOwnProperty()juga, yaitu

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}
Christoph
sumber
140
Terima kasih atas jawaban sebenarnya tanpa memaksa kami memuat perpustakaan yang tidak diinginkan.
8
ini bukan jawaban yang tepat. pertanyaan menyatakan bahwa prototipe harus digunakan! kebebasan memilih - haha ​​...
Sven Larson
1
Judul asli pertanyaan ini menyebutkan Prototipe, yang telah saya tambahkan kembali untuk kejelasan. Pertanyaan ini, sebagaimana dibuktikan oleh baris pertama tubuh, secara khusus menanyakan tentang lingkungan tempat Prototipe digunakan.
OverloadUT
1
Semakin banyak Anda menulis Javascript, semakin Anda tidak suka menulis forloop :)
Triptych
13
Sayangnya ini adalah pertanyaan yang muncul sebagai # 1 jika Anda mencari di Google untuk sesuatu seperti "bagaimana melakukan iterasi pada setiap objek properti javascript", jadi banyak orang yang datang ke sini mungkin mencari jawaban untuk pertanyaan ini. Pertanyaan yang mereka inginkan adalah ini: stackoverflow.com/questions/921789/… , yang sebenarnya tidak ada hubungannya dengan literal objek.
Baxissimo
0

Anda harus mengulangi kunci dan mendapatkan nilainya menggunakan tanda kurung siku.

Lihat: Bagaimana cara menghitung properti objek javascript?

EDIT: Jelas, ini membuat pertanyaan menjadi duplikat.

Can Berk Güder
sumber
Metode itu sangat tidak disarankan dalam dokumen Prototipe: prototypejs.org/api/array
OverloadUT
1
Juga, saya tidak berpikir ini adalah duplikat karena saya sedang mencari solusi asli Prototipe yang saya dapatkan. Pertanyaan lainnya cocok untuk seseorang yang tidak ingin menggunakan kerangka kerja, tetapi solusi ini jauh lebih aman jika Anda menggunakan Prototipe.
OverloadUT
1
@OverloadUT: Anda tidak membaca dengan cukup cermat: tidak disarankan untuk mengulang properti array, bukan objek biasa
Christoph