Pertanyaan Memeriksa apakah kunci ada di objek JavaScript?


Bagaimana cara memeriksa apakah kunci tertentu ada di objek atau larik JavaScript?

Jika kunci tidak ada, dan saya mencoba untuk mengaksesnya, apakah itu akan kembali salah? Atau melempar kesalahan?


2221
2017-07-08 13:21


asal


Jawaban:


Memeriksa untuk tidak terdefinisi bukanlah cara yang akurat untuk menguji apakah kunci itu ada. Bagaimana jika kunci itu ada tetapi nilainya sebenarnya undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

Anda sebaiknya menggunakan in operator:

"key" in obj // true, regardless of the actual value

Jika Anda ingin memeriksa apakah kunci tidak ada, jangan lupa untuk menggunakan tanda kurung:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

Atau, jika Anda ingin menguji secara khusus untuk properti contoh objek (dan bukan properti yang diwariskan), gunakan hasOwnProperty:

obj.hasOwnProperty("key") // true

Untuk perbandingan kinerja antara metode yang ada in, hasOwnProperty dan kuncinya adalah undefined, Lihat ini patokan


3074
2017-07-08 15:51



jawaban cepat

Bagaimana cara memeriksa apakah kunci tertentu ada di objek atau larik JavaScript?   Jika kunci tidak ada dan saya coba untuk mengaksesnya, apakah itu akan kembali salah? Atau melempar kesalahan?

Mengakses langsung properti yang hilang menggunakan gaya array (asosiatif) atau gaya objek akan mengembalikan tidak terdefinisi konstan.

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".

 var bizzareObj = {valid_key:  undefined};

Dalam hal ini, Anda harus menggunakannya hasOwnProperty atau di operator untuk mengetahui apakah kuncinya benar-benar ada. Tapi, tapi berapa harganya?

jadi, aku memberitahumu ...

di operator dan hasOwnProperty adalah "metode" yang menggunakan mekanisme Properti Descriptor di Javascript (mirip dengan pantulan Java dalam bahasa Java).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

Jenis Descriptor Properti digunakan untuk menjelaskan manipulasi dan reifikasi atribut properti bernama. Nilai dari jenis Descriptor Properti adalah catatan yang terdiri dari bidang bernama di mana setiap nama bidang adalah nama atribut dan nilainya adalah nilai atribut yang sesuai sebagaimana ditentukan dalam 8.6.1. Selain itu, bidang apa pun mungkin ada atau tidak ada.

Di sisi lain, memanggil metode objek atau kunci akan menggunakan mekanisme Javascript [[Dapatkan]]. Itu jauh lebih cepat!

patokan

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS.

Menggunakan di operator
var result = "Impression" in array;

Hasilnya adalah

12,931,832 ±0.21% ops/sec      92% slower 
Menggunakan hasOwnProperty
var result = array.hasOwnProperty("Impression")

Hasilnya adalah

16,021,758 ±0.45% ops/sec     91% slower
Mengakses elemen secara langsung (gaya tanda kurung)
var result = array["Impression"] === undefined

Hasilnya adalah

168,270,439 ±0.13 ops/sec     0.02% slower 
Mengakses elemen secara langsung (gaya objek)
var result = array.Impression  === undefined;

Hasilnya adalah

168,303,172 ±0.20%     fastest

EDIT: Apa alasan untuk menetapkan ke properti itu undefined nilai?

Pertanyaan itu membingungkan saya. Dalam Javascript, setidaknya ada dua referensi untuk objek yang tidak ada untuk menghindari masalah seperti ini: null dan undefined.

null adalah nilai primitif yang mewakili ketidakhadiran yang disengaja dari setiap nilai objek, atau dalam jangka pendek, dikonfirmasi kekurangan nilai. Di samping itu, undefined adalah nilai yang tidak diketahui (tidak didefinisikan). Jika ada properti yang akan digunakan nanti dengan layak nilai pertimbangkan digunakan null referensi bukan undefined karena pada saat awal properti itu dikonfirmasi kurang memiliki nilai.

Membandingkan:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

Menasihati

Hindari objek dengan undefined nilai-nilai. Periksa langsung kapan pun memungkinkan dan gunakan null untuk menginisialisasi nilai properti. Kalau tidak, gunakan yang lambat in operator atau hasOwnProperty() metode.

EDIT: 12/04/2018 - BUKAN RELEVANAPUN

Seperti orang-orang berkomentar, versi modern dari mesin Javascript (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 dapat diabaikan.


224
2018-02-27 16:38



Itu akan kembali undefined.

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefined adalah nilai konstanta khusus. Jadi Anda bisa mengatakan, mis.

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

Ini mungkin cara terbaik untuk memeriksa kunci yang hilang. Namun, seperti yang ditunjukkan dalam komentar di bawah ini, secara teoritis mungkin Anda ingin memiliki nilai yang sebenarnya undefined. Saya tidak pernah perlu melakukan ini dan tidak dapat memikirkan alasan mengapa saya ingin melakukannya, tetapi hanya demi kelengkapan, Anda dapat menggunakan in operator

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

114
2017-07-08 13:24



Itu jawaban yang diterima mengacu pada Obyek. Hati-hati menggunakan in operator di Array untuk menemukan data, bukan kunci:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

Untuk menguji elemen yang ada dalam Array: Cara terbaik untuk menemukan apakah suatu item ada dalam susunan JavaScript?


22
2017-07-01 12:45



"key" in obj

Apakah mungkin menguji hanya nilai atribut objek yang sangat berbeda dari kunci array


20
2018-04-25 15:45



Tiga cara untuk memeriksa apakah properti ada dalam objek javascript:

  1. !! obj.theProperty
    Akan mengonversi nilai menjadi bool. mengembalikan BENAR untuk semua kecuali nilai 'salah'
  2. 'theProperty' dalam obj
    Akan mengembalikan kebenaran jika properti itu ada, tidak peduli nilainya (bahkan kosong)
  3. obj.hasOwnProperty ('theProperty')
    Tidak memeriksa rantai prototipe. (karena semua objek memiliki metode 'toString', 1 dan 2 akan mengembalikan true di atasnya, sementara 3 dapat mengembalikan kesalahan di atasnya.)

Referensi:

http://book.mixu.net/node/ch5.html


20
2017-11-12 09:19



Jika Anda menggunakan underscore.js perpustakaan kemudian objek / operasi array menjadi sederhana.

Dalam metode _.has Anda dapat digunakan. Contoh:

yourArray = {age: "10"}

_.has(yourArray, "age")

kembali benar 

Tapi,

_.has(yourArray, "invalidKey")

kembali Salah


13
2018-05-29 19:37



Menjawab:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

Penjelasan:

Itu in operator akan memeriksa apakah kunci ada di objek. Jika Anda memeriksa apakah nilainya tidak terdefinisi: if (myObj["key"] === 'undefined'), Anda dapat mengalami masalah karena kunci mungkin ada di objek Anda dengan undefined nilai.

Untuk alasan itu, itu jauh lebih baik untuk pertama kali menggunakan in operator dan kemudian bandingkan nilai yang ada di dalam kunci setelah Anda sudah mengetahuinya.


10
2018-06-22 02:29



Inilah fungsi pembantu yang menurut saya cukup berguna

Ini keyExists(key, search) dapat digunakan untuk dengan mudah mencari kunci dalam objek atau array!

Hanya berikan kunci yang ingin Anda temukan, dan cari obj (objek atau larik) yang Anda inginkan.

function keyExists(key, search) {
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
    for (var i = 0; i < search.length; i++) {
        if (search[i] === key) {
            return true;
        }
    }
    return key in search;
}

Bagaimana cara menggunakannya:

Mencari kunci dalam Array

keyExists('apple', ['apple', 'banana', 'orange']); // true
keyExists('fruit', ['apple', 'banana', 'orange']); // false

Mencari kunci dalam Objek

keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false

Sudah cukup andal dan berfungsi dengan baik lintas-browser.


9
2018-03-05 12:56



vanila js

yourObjName.hasOwnProperty(key) : true ? false;

Jika Anda ingin memeriksa apakah objek memiliki setidaknya satu properti di es2015

Object.keys(yourObjName).length : true ? false

4
2018-01-25 15:39