Bagaimana cara memeriksa apakah objek memiliki properti di JavaScript?

168

Dengan asumsi saya menyatakan

var ad = {}; 

Bagaimana saya dapat memeriksa apakah objek ini akan berisi properti yang ditentukan pengguna?

Ricky
sumber

Jawaban:

86

Anda dapat mengulangi properti objek Anda sebagai berikut:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

Penting untuk menggunakan hasOwnProperty()metode ini, untuk menentukan apakah objek memiliki properti yang ditentukan sebagai properti langsung, dan tidak diwarisi dari rantai prototipe objek.

Edit

Dari komentar: Anda dapat meletakkan kode itu dalam suatu fungsi, dan membuatnya kembali salah begitu mencapai bagian di mana ada komentar

Uji kinerja

Test Of Object.Keys vs For..In Saat menguji untuk setiap properti

Daniel Vassallo
sumber
2
Hai Daniel, sebenarnya saya sedang mencari perangkat untuk memeriksa apakah suatu objek berisi barang yang ditentukan pengguna atau tidak. Tidak memeriksa apakah ada properti tertentu.
Ricky
7
@ Ricky: Anda dapat menempatkan kode itu dalam suatu fungsi, dan membuatnya kembali salah begitu mencapai bagian di mana ada komentar.
Daniel Vassallo
8
Saya pikir menggunakan hari-hari ini Object.keysakan menjadi yang termudah: var a = [1,2,3];a.something=4;console.log(Object.keys(a))Karena ini sudah menjadi bagian dari ECMA 5 Anda dapat dengan aman shim itu: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
HMR
2
Perhatikan bahwa "hari ini" dengan ES5, objek asli dapat memiliki properti sendiri yang tidak dapat dihitung, misalnya Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
RobG
2
Solusi ini adalah cara untuk memeriksa kunci yang ada , tetapi jawaban yang benar, efisien, dan paling benar di bawah ini menggunakan Object.keys (x) .length. Anda tidak perlu membuat fungsi sendiri, yang sudah ada!
dudewad
196

Anda dapat menggunakan Object.keysmetode bawaan untuk mendapatkan daftar kunci pada suatu objek dan menguji panjangnya.

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}
Dhaval Chaudhary
sumber
14
Ini di sini adalah jawaban yang benar. Jawaban yang diterima di atas adalah solusi dan lebih mahal daripada hanya memeriksa jumlah kunci; ini jauh lebih masuk akal .
dudewad
6
Object.keys ("mystring"); menghasilkan kunci juga yang menurut saya tidak diinginkan. Jawaban ini tidak lengkap menurut saya.
Mike de Klerk
2
@MikedeKlerk tolong baca dengan seksama itu bukan Object.keys ("mystring"); itu Object.keys (objectVariableName) yang akan mengembalikan array semua kunci dalam objek. mis: {'x': 'abc', 'y': 'def'} itu akan menjadi ['x', 'y']
Dhaval Chaudhary
3
@DhavalChaudhary Terima kasih atas balasan Anda atas komentar saya. Ketika saya mencoba kode ini var str = "MyString"; Object.keys(str);, konsol mengeluarkan 8 tombol, dari 0 hingga 7, untuk setiap karakter. Atau apakah saya masih belum mengerti jawabannya.
Mike de Klerk
6
@MikedeKlerk tapi itu hanya solusi untuk objek bukan untuk string, silakan lihat pertanyaan.
Dhaval Chaudhary
111

Bagaimana dengan membuat fungsi sederhana?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

The hasOwnPropertypemanggilan metode langsung pada Object.prototypehanya menambah sedikit lebih aman , bayangkan berikut menggunakan normal obj.hasOwnProperty(...)panggilan:

isEmptyObject({hasOwnProperty:'boom'});  // false

Catatan: (untuk masa depan) Metode di atas bergantung pada for...inpernyataan, dan pernyataan ini hanya mengulangi properti enumerable , dalam ECMAScript Standard yang saat ini paling banyak diterapkan (edisi ke-3) programmer tidak memiliki cara untuk membuat properti yang tidak dapat dihitung .

Namun ini telah berubah sekarang dengan ECMAScript Edisi ke-5 , dan kami dapat membuat properti yang tidak dapat dihitung, tidak dapat ditulis atau tidak dapat dihapus, sehingga metode di atas dapat gagal , misalnya:

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

Solusi ECMAScript 5 untuk masalah ini adalah:

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

The Object.getOwnPropertyNameskembali metode yang Arrayberisi nama-nama semua yang sifat sendiri suatu objek, enumerable atau tidak , metode ini sedang dilaksanakan sekarang dengan vendor browser, itu sudah pada 5 Beta Chrome dan terbaru WebKit Nightly Builds.

Object.defineProperty juga tersedia di browser tersebut dan rilis Firefox 3.7 Alpha terbaru.

CMS
sumber
1
Apa keuntungan untuk Object.prototype.hasOwnProperty.call (obj, prop) dibandingkan obj.hasOwnProperty (prop)?
Casey Chu
3
@Casey, diedit, jika suatu objek menimpa hasOwnPropertyproperti, fungsinya mungkin macet ... Saya tahu saya sedikit paranoid ... tapi kadang-kadang Anda tidak tahu di lingkungan seperti apa kode Anda akan digunakan, tetapi Anda tahu metode apa yang ingin Anda gunakan ...
CMS
2
+1 untuk menjawab pertanyaan ini ... dan pertanyaan lain di masa depan! :)
Daniel Vassallo
1
Perhatikan ada juga bug di IE di mana jika Anda memiliki properti dengan nama yang cocok dengan properti non-enumerable Object.prototype, itu tidak akan disebutkan oleh for...in. Jadi isEmptyObject({toString:1})akan gagal. Ini adalah salah satu alasan disayangkan Anda tidak dapat cukup menggunakan Objectsebagai pemetaan tujuan umum.
bobince
1
@ MichaelMartin-Smucker— kunci hanya mengembalikan properti enumerable sendiri, jadi tidak cocok di sini.
RobG
58

Dengan jQuery Anda dapat menggunakan:

$.isEmptyObject(obj); // Returns: Boolean

Pada jQuery 1.4 metode ini memeriksa kedua properti pada objek itu sendiri dan properti yang diwarisi dari prototipe (dalam hal itu tidak menggunakan hasOwnProperty).

Dengan ECMAScript 5th Edition di browser modern (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) Anda dapat menggunakan metode Object.keys bawaan :

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

Atau JavaScript lama yang sederhana:

var isEmpty = function(obj) {
               for(var p in obj){
                  return false;
               }
               return true;
            };
kayz1
sumber
13

Jika Anda menggunakan underscore.js maka Anda dapat menggunakan fungsi _.isEmpty :

var obj = {};
var emptyObject = _.isEmpty(obj);
Gruff Bunny
sumber
1
Hanya untuk siapa saja yang lewat, ini bukan metode yang didedikasikan untuk objek. _.isEmpty([]) // true Pastikan untuk memeriksa dulu: stackoverflow.com/a/22482737/1922747
djv
11

Jika Anda bersedia menggunakan lodash , Anda dapat menggunakan somemetode ini.

_.some(obj) // returns true or false

Lihat contoh jsbin kecil ini

sfs
sumber
var x = [1,2] // true
djv
@damionjn Saya menambahkan kode Anda ke contoh. Saya melihat poin Anda dengan array mengembalikan jawaban yang salah, tetapi OP awalnya menyatakan variabel sebagai objek jadi saya percaya tidak apa-apa untuk menganggap ini. Ada jawaban di atas yang menggunakan metode isEmpty garis bawah (lodash memiliki metode yang sama). Jawaban itu memiliki masalah yang sama persis. Jika Anda memberikan isEmpty array kosong, Anda juga akan mendapatkan hasil yang salah.
sfs
Cukup adil, tetapi kami harus memberikan jawaban dengan semua pangkalan yang dicakup untuk memastikan praktik terbaik. Anda benar, saya memberikan jawaban yang benar tanpa kritik. Hanya untuk siapa saja yang lewat, ini bukan metode yang didedikasikan untuk objek. _.some([1, 2]) // true Pastikan untuk memeriksa dulu: stackoverflow.com/a/13356338/1922747
djv
5
for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

Jika Anda harus aman dan memeriksa prototipe Obyek (ini ditambahkan oleh perpustakaan tertentu dan tidak ada di sana secara default):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties
Casey Chu
sumber
1
dalam solusi Anda, tidak ada pemfilteran untuk properti prototipe yang tidak diinginkan, itu berarti mungkin terjadi kesalahan saat menggunakan perpustakaan seperti Prototype.js atau pengguna yang tidak berpengalaman menambahkan properti prototipe tambahan ke objek. Lihatlah solusi Daniels di halaman ini.
Joscha
Anda tidak harus menggunakan perpustakaan atau tidak berpengalaman untuk memperpanjang prototipe objek. Beberapa programmer berpengalaman melakukan ini sepanjang waktu.
Alsciende
2
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

Anggota berarti properti Anggota, variabel anggota, apa pun yang Anda ingin menyebutnya> _>

Kode di atas akan mengembalikan SEMUA, termasuk toString ... Jika Anda hanya ingin melihat apakah prototipe objek telah diperpanjang:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

Catatan A: Kami memeriksa untuk melihat apakah anggota objek dummy memiliki tipe yang sama dengan anggota objek pengujian kami. Jika ekstensi, tipe anggota dummyobject harus "tidak ditentukan"

Berkutil
sumber
Hai, dapatkah saya tahu apakah suatu objek mengandung properti atau tidak? Terima kasih
Ricky
dalam solusi Anda, tidak ada pemfilteran untuk properti prototipe yang tidak diinginkan, itu berarti mungkin terjadi kesalahan saat menggunakan perpustakaan seperti Prototype.js atau pengguna yang tidak berpengalaman menambahkan properti prototipe tambahan ke objek.
Joscha
lihat solusi Daniels di halaman ini - rawan kesalahan!
Joscha
2
Blok kode pertama Anda tidak mencakup sama sekali. blok kode kedua salah tingkah jika saya menambahkan variabel ke objek "iklan" yang tidak ditentukan. Sungguh, lihat jawaban Daniels, itu satu-satunya yang benar dan cepat, karena menggunakan implementasi asli yang disebut "hasOwnProperty".
Joscha
@ Ricky: Jika Anda ingin memeriksa apakah suatu objek berisi properti, Anda dapat menggunakan contoh dalam jawaban saya: stackoverflow.com/questions/2673121/… . Jika kode mencapai komentar, objek Anda tidak akan memiliki properti langsung. Jika tidak, itu akan terjadi.
Daniel Vassallo
2
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

Sederhana, berfungsi di setiap peramban, dan meskipun secara teknis perulangan untuk semua tombol pada objek, BUKAN perulangan di antara mereka semua ... baik ada 0 dan perulangan tidak berjalan atau ada beberapa dan rusak setelah yang pertama satu (karena semua yang kami periksa adalah jika ada APAPUN ... jadi mengapa lanjut?)

Jimbo Jonny
sumber
1

Jawabannya sangat terlambat, tetapi ini adalah bagaimana Anda bisa mengatasinya dengan prototipe.

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}
Keuntungan
sumber
0

Ketika yakin bahwa objek tersebut adalah objek yang ditentukan pengguna, cara termudah untuk menentukan apakah UDO kosong, akan menjadi kode berikut:

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

Meskipun metode ini (secara alami) adalah metode deduktif, - ini adalah yang tercepat dan tercepat.

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

ps:! jangan menggunakannya pada objek yang ditentukan browser.

Bill the Lizard
sumber
... kembalikan 0; return 1}; akan sama?
commonpike
1
@pike no, return! 1; return! 0 sama dengan return false; return true
Christophe
0

Jawaban terlambat, tetapi beberapa kerangka kerja menangani objek sebagai enumerables. Karena itu, bob.js dapat melakukannya seperti ini:

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();
Tengiz
sumber
0

Anda dapat menggunakan yang berikut ini:

Bang ganda !! pencarian properti

var a = !![]; // true
var a = !!null; // false

hasOwnProperty Ini adalah sesuatu yang biasa saya gunakan:

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

Namun, JavaScript memutuskan untuk tidak melindungi nama metode, sehingga bisa dirusak.

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

menopang di myObject

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

jenis

if (typeof myObject.name !== 'undefined') {
  // do something
}

Namun, itu tidak memeriksa null.

Saya pikir ini adalah cara terbaik.

di operator

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

hasil:

Nama ada di myObject

Berikut ini adalah tautan yang menjelaskan lebih rinci tentang operator in: Menentukan apakah properti objek ada

James Drinkard
sumber
0

Fungsi ES6

/**
 * Returns true if an object is empty.
 * @param  {*} obj the object to test
 * @return {boolean} returns true if object is empty, otherwise returns false
 */
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0

Contoh:


let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false
Sébastien
sumber
-1

Bagaimana dengan ini?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj
Peter Toth
sumber
Jawaban ini tidak menjawab pertanyaan. OP menanyakan apakah suatu objek berisi properti yang ditentukan pengguna - jawaban Anda memeriksa apakah objek itu sendiri akan dikonversi ke nilai palsu Boolean.
Jasmonate
... dan saya juga menyadari kemudian bahwa James sudah memasukkan opsi ini dalam jawabannya. Maaf kawan
Peter Toth