indexOf tetapi untuk objek? [duplikat]

Saya ingin melihat suatu objek dan menetapkan setiap properti yang ada ke suatu variabel.

Ada 4 kemungkinan properti. Beberapa objek memiliki keempatnya. Beberapa objek mungkin hanya memiliki dua.

Bagaimana cara memeriksa apakah properti tertentu ada? Apakah ada yang setara dengan indexOf() untuk array tetapi untuk objek?


person gloopit    schedule 18.08.2016    source sumber
comment
Sangat sulit membayangkan kode Anda hanya dari teks biasa. Mau mengungkapkan kode sumber yang relevan di sini? Hal ini agar kami dapat membantu Anda dengan lebih baik.   -  person Samuel Toh    schedule 18.08.2016
comment
Sudahkah Anda mencoba hasOwnProperty atau mengonversi objek menjadi array dengan Object.keys?   -  person litel    schedule 18.08.2016
comment
jika propertinya tidak boleh salah (misalnya semuanya adalah sub-objek), maka pengetikan bebek dapat dibaca dan cepat : if(obj.key1); alert(obj.key1.name);   -  person dandavis    schedule 18.08.2016
comment
false atau falsey, termasuk 0 dan nilai umum lainnya   -  person qxz    schedule 18.08.2016
comment
@qxz: ya, itu yang saya maksud, keputusan yang bagus   -  person dandavis    schedule 18.08.2016


Jawaban (4)


Jika Anda hanya tertarik pada properti yang disetel langsung pada objek (tidak dapat diakses melalui rantai prototipe) maka hasOwnProperty akan memberikan nilai boolean, true, jika suatu objek memiliki properti yang ditentukan.

Misalnya: testObject.hasOwnProperty('propertyToCheckFor') akan mengembalikan true jika testObject.propertyToCheckFor ada, jika tidak maka akan menjadi false.

Lihat kode berikut untuk contoh yang lebih luas:

var obj1 = {
  a: 1
};
var obj2 = {
  a: 1,
  b: 2
};
var obj3 = {
  b: 2,
  c: 3
};
var obj4 = {
  a: 1,
  b: 2,
  c: 3
};


// For dispaly purposes
document.write('<pre>' + JSON.stringify({
  obj1: {
    hasA: obj1.hasOwnProperty('a'),
    hasB: obj1.hasOwnProperty('b'),
    hasC: obj1.hasOwnProperty('c')
  },
  obj2: {
    hasA: obj2.hasOwnProperty('a'),
    hasB: obj2.hasOwnProperty('b'),
    hasC: obj2.hasOwnProperty('c')
  },
  obj3: {
    hasA: obj3.hasOwnProperty('a'),
    hasB: obj3.hasOwnProperty('b'),
    hasC: obj3.hasOwnProperty('c')
  },
  obj4: {
    hasA: obj4.hasOwnProperty('a'),
    hasB: obj4.hasOwnProperty('b'),
    hasC: obj4.hasOwnProperty('c')
  }
}, null, 2) + '</pre>');

person Jason Cust    schedule 18.08.2016
comment
@dandavis Apa? Jika seseorang melakukan hal itu maka mereka pantas masuk dalam lingkaran neraka ke-7 yang mereka alami. - person Jason Cust; 18.08.2016
comment
Saya juga berpikir begitu, sampai saya menemukannya di alam liar pada spreadsheet excel tentang real estat yang dikonversi ke JSON. itu bukan fungsi, jadi dibuang begitu saja, tapi itu membuat saya sangat anal dalam memeriksa keanggotaan objek... - person dandavis; 18.08.2016

Gunakan kata kunci in:

"key" in object

yang mengembalikan true atau false, bergantung apakah objek, atau apa pun dalam rantai prototipenya, memiliki properti tersebut.

Anda juga dapat menggunakan object.hasOwnProperty("key"), yang hanya akan menjadi true jika objek tersebut memiliki key sebagai propertinya sendiri, bukan prototipenya. Contoh:

var object = {};
"toString" in object; // true
object.hasOwnProperty("toString"); // false

Perhatikan (sesuai komentar @dandavis) bahwa jika object memiliki properti khusus bernama hasOwnProperty, ini akan digagalkan; untuk menyiasatinya, gunakan hasOwnProperty.call(object, "key"). Contoh:

var a = {hasOwnProperty: Boolean};
a.hasOwnProperty('name'); // true
hasOwnProperty.call(a, 'name'); // false
person qxz    schedule 18.08.2016

Anda dapat menggunakan tugas destrukturisasi. Jika nilai tidak ditentukan, variabel akan disetel ke undefined. Anda juga dapat memeriksa apakah variabel ditentukan setelah destrukturisasi variabel delete dengan referensi.

var data = {a:1, b:2, c:3};

var {a, b, c, d} = data; // `d`: `undefined`
person guest271314    schedule 18.08.2016
comment
Perhatikan bahwa ini merupakan fitur ES6, dan tidak memiliki dukungan luas: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person csander; 18.08.2016
comment
itu benar-benar rapi dan bersih, tapi menurut saya itu bukan yang dibutuhkan OP karena sama rumitnya (jika tidak lebih) untuk memeriksa leksikal sebagai anggota. - person dandavis; 18.08.2016

person    schedule
comment
Object.keys+forEach berfungsi dengan baik, tetapi jauh lebih lambat daripada filter untuk objek besar... - person dandavis; 18.08.2016
comment
jangan gunakan benda besar ;) - person cstuncsik; 18.08.2016