var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Bagaimana variabel tersebut propt
mewakili sifat-sifat objek? Ini bukan metode atau properti bawaan. Mengapa muncul dengan setiap properti di objek?
javascript
loops
object
Rafay
sumber
sumber
if (typeof(obj[propt]) === 'object') {
/ * Lakukan lagi * /}
Jawaban:
Meratakan properti membutuhkan
hasOwnProperty
pemeriksaan tambahan ini :Ini perlu karena prototipe objek berisi properti tambahan untuk objek yang secara teknis merupakan bagian dari objek. Properti tambahan ini diwarisi dari kelas objek dasar, tetapi masih properti
obj
.hasOwnProperty
cukup periksa untuk melihat apakah ini properti khusus untuk kelas ini, dan tidak ada yang diwarisi dari kelas dasar.Dimungkinkan juga untuk memanggil
hasOwnProperty
objek itu sendiri:Tetapi ini akan gagal jika objek memiliki bidang yang tidak terkait dengan nama yang sama:
Itu sebabnya lebih aman untuk menyebutnya
Object.prototype
:sumber
object.hasOwnProperty()
? Bukankah fakta yangproperty
memiliki nilai apa pun menyiratkan bahwa itu ada di dalamnyaobject
?property
adalah string di sini, seharusnya dipanggilpropertyName
. Jika tidak dapat menyebabkan kebingungan bagi pemula JS seperti saya, yaitu apa yang harus dilakukan di dalamif
.Pada JavaScript 1.8.5 Anda dapat menggunakan
Object.keys(obj)
untuk mendapatkan Array properti yang didefinisikan pada objek itu sendiri (yang mengembalikan true untukobj.hasOwnProperty(key)
).Ini lebih baik (dan lebih mudah dibaca) daripada menggunakan for-in loop.
Ini didukung pada browser ini:
Lihat referensi Mozilla Developer Network Object.keys () untuk informasi lebih lanjut.
sumber
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... sepertinya bisa dibaca oleh sayaCewek dan cowok kita di 2019 dan kita tidak punya banyak waktu untuk mengetik ... Jadi mari kita lakukan ini keren baru ECMAScript 2016:
sumber
obj=window.performance.memory
: - / Di mana sepertifor in
halnya. yaituvar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
hanya didukung oleh chrome danObject.keys(obj)
mengembalikan array kosong. Ini tidak ada hubungannya dengan.map
.e
, saya telah memposting intisari ini. Ini pada dasarnya sama seperti kebanyakan implementasi hash, dan menggunakan(
(key)
=>
(value)
)
alih-alih{
key
=>
value
}
, tetapi jika Anda belum pernah berurusan dengan itu sebelumnya, ini dapat membantu Anda memvisualisasikannya dengan lebih baik: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8Ini adalah
for...in statement
( MDN , spec ECMAScript ).Anda dapat membacanya sebagai " UNTUK setiap properti DI yang
obj
objek, menetapkan setiap properti untuk propt variabel pada gilirannya".sumber
in
operator danfor
pernyataan tidak terlibat sama sekali,for-in
pernyataan merupakan produksi tata bahasa sendiri:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
Dalam implementasi ES terbaru, Anda dapat menggunakan
Object.entries
:atau
Jika Anda hanya ingin mengulangi nilai-nilai tersebut, maka gunakan Object.values:
atau
sumber
Itu hanya satu
for...in
lingkaran. Lihatlah dokumentasi di Mozilla .sumber
Jika lingkungan Anda mendukung ES2017 maka saya akan merekomendasikan Object.entries :
Seperti yang ditunjukkan dalam dokumentasi Mozillas Object.entries () :
Pada dasarnya dengan Object.entries kita bisa melupakan langkah tambahan berikut yang diperlukan dengan yang lebih lama untuk ... dalam lingkaran:
sumber
jquery memungkinkan Anda untuk melakukan ini sekarang:
sumber
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each tidak cocok untuk objek. Jika suatu objek kebetulan memiliki properti panjang dan nilainya kebetulan menjadi nol, seluruh objek diperlakukan seolah-olah itu adalah array kosong.Jawaban Dominik sempurna, saya hanya suka melakukannya seperti itu, karena lebih bersih untuk dibaca:
sumber
Object
dengan huruf besar, bukan?Jawaban di atas agak menjengkelkan karena mereka tidak menjelaskan apa yang Anda lakukan di dalam for for loop setelah Anda memastikan itu objek: ANDA TIDAK MENGAKSES LANGSUNG! Anda sebenarnya hanya mengirimkan KUNCI yang perlu Anda terapkan ke OBJ:
Ini semua aman ECMA5. Bahkan bekerja di versi JS lumpuh seperti Badak;)
sumber
Untuk menambahkan penggunaan ES2015
Reflect.ownKeys(obj)
dan juga mengulangi properti melalui iterator.Sebagai contoh:
dapat diulangi oleh
Jika Anda ingin beralih langsung ke nilai-nilai kunci suatu objek, Anda dapat mendefinisikan
iterator
, seperti halnya iterator default JavaScipts untuk string, array, array yang diketik, Map dan Set.JS akan mencoba untuk beralih melalui properti iterator default, yang harus didefinisikan sebagai
Symbol.iterator
.Jika Anda ingin dapat mengulangi semua objek, Anda dapat menambahkannya sebagai prototipe Obyek:
Ini akan memungkinkan Anda untuk mengulangi nilai-nilai suatu objek dengan for ... of loop, misalnya:
Perhatian : Saat menulis jawaban ini (Juni 2018) semua browser lain, kecuali IE, mendukung generator dan
for...of
iterasi melaluiSymbol.iterator
sumber
sumber
forEach
melewatkan nilai-nilai kosong , saya pikir Anda bisa menghilangkan if dan lakukan sajaObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
seperti jawaban Frank Roth.The for ... in loop mewakili setiap properti dalam suatu objek karena itu seperti for for loop. Anda menetapkan propt di dalam untuk ... dalam lingkaran dengan melakukan:
A for ... in loop berulang melalui properti enumerable dari suatu objek. Variabel mana pun yang Anda tetapkan, atau masukkan dalam untuk ... dalam loop, berubah setiap kali ia pergi ke properti berikutnya yang diulanginya. Variabel dalam for ... in loop berulang melalui tombol, tetapi nilainya adalah nilai kunci. Sebagai contoh:
Anda dapat melihat perbedaan variabel dari nilai variabel. Sebaliknya, for ... of loop melakukan yang sebaliknya.
Saya harap ini membantu.
sumber
sumber
forEach
lebih tepat di sini, sepertimap
yang dimaksudkan untuk mengembalikan array baru dengan hasil memanggil blok kode pada setiap iterasi. Tapi kami hanya tertarik pada efek samping dari setiap iterasi, bukan nilai balik, maka kami tidak membutuhkan array baru yangmap
memberi kami.sumber
Anda bisa menggunakan Lodash. Dokumentasi
sumber
for
Loop Anda mengulangi semua properti objekobj
.propt
didefinisikan di baris pertama for for loop Anda. Ini adalah string yang merupakan nama propertiobj
objek. Pada iterasi pertama dari loop,propt
akan menjadi "nama".sumber
Objek dalam JavaScript adalah kumpulan properti dan oleh karena itu dapat dilingkarkan dalam untuk setiap pernyataan.
Anda harus menganggapnya
obj
sebagai pengumpulan nilai utama.sumber
Saat ini Anda dapat mengonversi objek JS standar menjadi objek yang dapat diubah hanya dengan menambahkan metode Symbol.iterator. Kemudian Anda dapat menggunakan
for of
loop dan mengakses nilainya secara langsung atau bahkan dapat menggunakan operator spread pada objek juga. Keren. Mari kita lihat bagaimana kita bisa membuatnya:sumber
function*
penemuannya!Jika menjalankan Node, saya akan merekomendasikan:
sumber
Sementara jawaban berperingkat teratas benar, berikut ini adalah kasus penggunaan alternatif yaitu jika Anda mengulangi objek dan ingin membuat array pada akhirnya. Gunakan
.map
sebagai gantiforEach
sumber
Juga menambahkan cara rekursif:
Pemakaian:
sumber
Untuk apa..di dalam loop adalah bahwa ia menciptakan variabel baru (var someVariable) dan kemudian menyimpan setiap properti dari objek yang diberikan dalam variabel baru ini (someVariable) satu per satu. Karenanya jika Anda menggunakan blok {}, Anda dapat mengulanginya. Perhatikan contoh berikut.
sumber
obj[someVariable]
. Mungkin alasannya begitu banyak diturunkan karena tidak rekursif. Jadi ini tidak akan menjadi solusi yang memadai jika Anda memiliki objek yang sangat terstruktur.Di sini saya mengulangi setiap node dan membuat nama node yang bermakna. Jika Anda perhatikan, instanceOf Array dan instanceOf Object cukup banyak melakukan hal yang sama (dalam aplikasi saya, saya memberikan logika yang berbeda)
note - Saya terinspirasi oleh jawaban Ondrej Svejdar. Tetapi solusi ini memiliki kinerja yang lebih baik dan kurang ambigu
sumber
Anda pada dasarnya ingin mengulang setiap properti di objek.
JSFiddle
sumber
obj(prop)
<- TypeError: obj bukan fungsihasOwnProperty
atribut. Itu seharusnya bekerja sekarang.Saya ingin menambahkan jawaban di atas, karena Anda mungkin memiliki niat berbeda dari Javascript. Objek JSON dan objek Javascript adalah hal yang berbeda, dan Anda mungkin ingin beralih melalui properti objek JSON menggunakan solusi yang diusulkan di atas, dan kemudian terkejut.
Misalkan Anda memiliki objek JSON seperti:
Cara yang salah untuk beralih melalui 'propertinya':
Anda mungkin akan terkejut melihat konsol logging
0
,1
, dll ketika iterasi melalui sifat-sifatprop1
danprop2
danprop3_1
. Objek-objek itu adalah urutan, dan indeks urutan adalah properti dari objek itu dalam Javascript.Cara yang lebih baik untuk mengulang secara berulang melalui properti objek JSON adalah dengan terlebih dahulu memeriksa apakah objek tersebut berurutan atau tidak:
sumber
Untuk lebih mempersempit jawaban yang diterima, perlu dicatat bahwa jika Anda membuat instance objek dengan
var object = Object.create(null)
makaobject.hasOwnProperty(property)
akan memicu TypeError. Jadi untuk amannya, Anda harus menyebutnya dari prototipe seperti ini:sumber
Periksa tautan ini, ini akan membantu https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
sumber