Jawaban:
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.
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
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/…
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
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
}
var str = "MyString"; Object.keys(str);, konsol mengeluarkan 8 tombol, dari 0 hingga 7, untuk setiap karakter. Atau apakah saya masih belum mengerti jawabannya.
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.
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 ...
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.
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;
};
Browser terbaru (dan node.js) mendukung Object.keys () yang mengembalikan array dengan semua kunci dalam objek literal Anda sehingga Anda bisa melakukan hal berikut:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
Dukungan Browser: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Jika Anda menggunakan underscore.js maka Anda dapat menggunakan fungsi _.isEmpty :
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true Pastikan untuk memeriksa dulu: stackoverflow.com/a/22482737/1922747
Jika Anda bersedia menggunakan lodash , Anda dapat menggunakan somemetode ini.
_.some(obj) // returns true or false
Lihat contoh jsbin kecil ini
_.some([1, 2]) // true Pastikan untuk memeriksa dulu: stackoverflow.com/a/13356338/1922747
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
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"
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?)
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();
}
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.
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
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
Bagaimana dengan ini?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj