Bagaimana cara saya memeriksa apakah ada kunci tertentu dalam objek atau array JavaScript?
Jika kunci tidak ada, dan saya mencoba mengaksesnya, akankah itu kembali palsu? Atau melempar kesalahan?
javascript
arrays
object
Adam Ernst
sumber
sumber
property.key = property.key || 'some default value'
, kalau-kalau saya ingin kunci itu ada dengan beberapa nilai untuk ituJawaban:
Memeriksa ketidaktentuan bukan cara yang akurat untuk menguji apakah kunci itu ada. Bagaimana jika kuncinya ada tetapi nilainya sebenarnya
undefined
?Anda sebaiknya menggunakan
in
operator:Jika Anda ingin memeriksa apakah kunci tidak ada, ingatlah untuk menggunakan tanda kurung:
Atau, jika Anda ingin secara khusus menguji properti dari instance objek (dan bukan properti yang diwarisi), gunakan
hasOwnProperty
:Untuk kinerja perbandingan antara metode yang
in
,hasOwnProperty
dan kunci adalahundefined
, melihat ini patokansumber
jawaban cepat
Mengakses secara langsung properti yang hilang menggunakan gaya array (asosiatif) atau gaya objek akan menghasilkan konstanta yang tidak terdefinisi .
Lambat dan dapat diandalkan di operator dan hasOwnProperty metode
Seperti yang telah disebutkan orang di sini, Anda dapat memiliki objek dengan properti yang terkait dengan konstanta "tidak terdefinisi".
Dalam hal ini, Anda harus menggunakan hasOwnProperty atau di operator untuk mengetahui apakah kuncinya benar-benar ada. Tapi, berapa harganya?
jadi, saya katakan ...
di operator dan hasOwnProperty adalah "metode" yang menggunakan mekanisme Property Descriptor dalam Javascript (mirip dengan refleksi Java dalam bahasa Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Di sisi lain, memanggil metode objek atau kunci akan menggunakan mekanisme Javascript [[Get]]. Itu jauh lebih cepat!
patokan
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Menggunakan dalam operatorHasilnya adalah
Menggunakan hasOwnPropertyHasilnya adalah
Mengakses elemen secara langsung (gaya kurung)Hasilnya adalah
Mengakses elemen secara langsung (gaya objek)Hasilnya adalah
EDIT: Apa alasan untuk memberikan
undefined
nilai pada properti ?Pertanyaan itu membingungkan saya. Dalam Javascript, setidaknya ada dua referensi untuk objek yang tidak ada untuk menghindari masalah seperti ini:
null
danundefined
.null
adalah nilai primitif yang menunjukkan tidak adanya nilai objek yang disengaja, atau dalam jangka pendek, kurangnya nilai yang dikonfirmasi . Di sisi lain,undefined
adalah nilai yang tidak diketahui (tidak didefinisikan). Jika ada properti yang akan digunakan kemudian dengan nilai yang tepat, pertimbangkan untuk menggunakannull
referensi alih-alihundefined
karena pada saat awal properti tersebut dikonfirmasi tidak memiliki nilai.Membandingkan:
Menasihati
Hindari benda dengan
undefined
nilai. Periksa secara langsung jika memungkinkan dan gunakannull
untuk menginisialisasi nilai properti. Jika tidak, gunakanin
operator atauhasOwnProperty()
metode yang lambat .EDIT: 12/04/2018 - JANGAN RELEVAN LAGI
Seperti yang dikomentari orang, mesin Javascript versi modern (dengan pengecualian firefox) telah mengubah pendekatan untuk properti akses. Implementasi saat ini lebih lambat dari yang sebelumnya untuk kasus khusus ini tetapi perbedaan antara kunci akses dan objek diabaikan.
sumber
delete hash[key]
ini jauh lebih lambat dibandingkanhash[key] = undefined
. Tentu saja dalam kasus ini tidak masuk akal bagi saya untuk membutuhkanin
operator, tetapi bertindak sebagai contoh berlawanan dengan "kita harus selalu menghindari menetapkan nilai yang tidak terdefinisi".Itu akan kembali
undefined
.undefined
adalah nilai konstan khusus. Jadi Anda bisa mengatakan, misalnyaIni mungkin cara terbaik untuk memeriksa kunci yang hilang. Namun, seperti yang ditunjukkan dalam komentar di bawah ini, secara teori dimungkinkan bahwa Anda ingin memiliki nilai yang sebenarnya
undefined
. Saya tidak pernah perlu melakukan ini dan tidak bisa memikirkan alasan mengapa saya ingin, tetapi hanya demi kelengkapan, Anda dapat menggunakanin
operatorsumber
var undefined = 42;
. Saat menguji alat peraga tidak terdefinisi, Anda harus selalu menggunakan((typeof variable) === "undefined")
.undefined
bukan properti yang bisa ditulisi menurut spec ecma-international.org/ecma-262/5.1/#sec-15.1.1.3The jawaban yang diterima mengacu pada Obyek . Berhati-hatilah menggunakan
in
operator di Array untuk menemukan data alih-alih kunci:Untuk menguji elemen yang ada dalam Array: Cara terbaik untuk mengetahui apakah suatu item ada dalam array JavaScript?
sumber
Kemungkinan menguji hanya nilai atribut objek yang sangat berbeda dari kunci array
sumber
Tiga cara untuk memeriksa apakah suatu properti hadir dalam objek javascript:
!!obj.theProperty
Akan mengkonversi nilai menjadi bool. kembali
true
untuk semua kecualifalse
nilainyatheProperty
' in objAkan mengembalikan true jika properti itu ada, tidak peduli nilainya (bahkan kosong)
obj.hasOwnProperty('theProperty')
Tidak memeriksa rantai prototipe. (karena semua objek memiliki
toString
metode, 1 dan 2 akan mengembalikan true di atasnya, sementara 3 dapat mengembalikan false di atasnya.)Referensi:
sumber
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
bukan solusi untuk memeriksa apakah suatu objek memiliki properti bernamatheProperty
. Gagal untuk nilai properti falseyundefined
, null, numerik0
atauNaN
, dan string kosong""
Jika Anda menggunakan pustaka underscore.js maka operasi objek / array menjadi sederhana.
Dalam kasus Anda _memiliki metode yang dapat digunakan. Contoh:
mengembalikan true
Tapi,
mengembalikan salah
sumber
Menjawab:
Penjelasan:
The
in
Operator akan memeriksa apakah kunci ada di objek. Jika Anda memeriksa apakah nilainya tidak ditentukan:,if (myObj["key"] === 'undefined')
Anda bisa mengalami masalah karena kunci mungkin ada di objek Anda denganundefined
nilai.Karena itu, jauh lebih baik untuk menggunakan
in
operator terlebih dahulu dan kemudian membandingkan nilai yang ada di dalam kunci begitu Anda sudah tahu keberadaannya.sumber
Inilah fungsi pembantu yang menurut saya cukup berguna
Ini
keyExists(key, search)
dapat digunakan untuk dengan mudah mencari kunci di dalam objek atau array!Cukup berikan kunci yang ingin Anda temukan, dan cari objek (objek atau array) yang ingin Anda temukan.
Sudah cukup andal dan berfungsi dengan baik lintas-browser.
sumber
Array.indexOf
? (jika Anda mencari nilai, yaitu)vanila js
Jika Anda ingin memeriksa apakah objek memiliki setidaknya satu properti di es2015
sumber
Solusi ES6
menggunakan
Array#some
danObject.keys
. Ini akan mengembalikan true jika kunci yang diberikan ada di objek atau false jika tidak.Contoh satu baris.
sumber
Kita bisa menggunakan -
hasOwnProperty.call(obj, key);
Cara underscore.js -
sumber
Cara termudah untuk memeriksa adalah
sebagai contoh:
Nilai kembali sebagai true menunjukkan bahwa kunci ada di objek.
sumber
Bagi mereka yang sudah
lodash
termasuk dalam proyek mereka:Ada metode _situs Lodash yang mencoba untuk mendapatkan kunci "dalam":
Ini akan secara efektif memeriksa apakah kunci itu, seberapa dalam , didefinisikan dan tidak akan menimbulkan kesalahan yang dapat membahayakan aliran program Anda jika kunci itu tidak ditentukan.
sumber
Meskipun ini tidak selalu memeriksa apakah ada kunci, itu memeriksa kebenaran suatu nilai. Yang
undefined
dannull
jatuh di bawah.Boolean(obj.foo)
Solusi ini bekerja paling baik untuk saya karena saya menggunakan naskah, dan menggunakan string seperti ini
'foo' in obj
atauobj.hasOwnProperty('foo')
untuk memeriksa apakah ada kunci atau tidak tidak memberi saya intellisense.sumber
Jika Anda ingin memeriksa kunci apa pun pada kedalaman apa pun pada objek dan memperhitungkan nilai falsey pertimbangkan baris ini untuk fungsi utilitas:
Hasil
Lihat juga paket NPM ini: https://www.npmjs.com/package/has-deep-value
sumber
sumber
Di dunia 'array' kita bisa melihat indeks sebagai semacam kunci. Yang mengejutkan,
in
operator (yang merupakan pilihan tepat untuk objek) juga bekerja dengan array. Nilai yang dikembalikan untuk kunci tidak ada adalahundefined
sumber
yourArray.indexOf (yourArrayKeyName)> -1
benar
Salah
sumber
Contoh ini dapat menunjukkan perbedaan antara cara-cara defferent. Semoga ini akan membantu Anda memilih yang tepat untuk kebutuhan Anda:
sumber
Solusi luar biasa baru dengan Destrukturisasi JavaScript :
Periksa penggunaan Destrukturisasi JavaScript lainnya
sumber