Cum să verifici dacă un obiect are proprietăți în JavaScript?
Presupunând că declar
var ad = {};
Cum pot verifica dacă acest obiect va conține proprietăți definite de utilizator?
Răspuns #1
Poți folosi metoda încorporată Object.keys pentru a obține o listă de chei pe un obiect și pentru a-i testa lungimea.
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){
// Your code here if x has some properties
}
Răspunsul #2
Ce zici de a face o funcție simplă?
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
Apelul metodei hasOwnProperty direct pe Object.prototype este doar pentru a adăuga puțină mai multă siguranță, imaginează-ți următorul scenariu folosind un apel normal obj.hasOwnProperty(...):
isEmptyObject({hasOwnProperty:'boom'}); // false
Notă: (pentru viitor) Metoda de mai sus se bazează pe declarația for...in, iar această declarație iterează doar peste proprietăți enumerabile, în Standardul ECMAScript implementat cel mai larg în prezent (ediția a 3-a) programatorul nu are nicio modalitate de a crea proprietăți neenumerabile.
Totuși, acest lucru s-a schimbat acum odată cu ECMAScript, Ediția a 5-a, și suntem capabili să creăm proprietăți care nu pot fi enumerate, modificate sau șterse, astfel încât metoda de mai sus poate să eșueze, de exemplu:
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!!
O soluție ECMAScript 5 pentru această problemă ar fi:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
Metoda Object.getOwnPropertyNames returnează un Array care conține numele tuturor proprietăților proprii ale unui obiect, enumerabile sau nu, această metodă fiind implementată acum de către furnizorii de browsere, este deja disponibilă în Chrome 5 Beta și în cele mai recente WebKit Nightly Builds.
Object.defineProperty este de asemenea disponibil pe acele browsere și pe ultimele versiuni Firefox 3.7 Alpha.
Răspunsul #3
Poți parcurge proprietățile obiectului tău după cum urmează:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
Este important să folosești metoda hasOwnProperty(), pentru a determina dacă obiectul are proprietatea specificată ca proprietate directă și nu moștenită din lanțul de prototip al obiectului.
Editează
Din comentarii: Poți să pui acel cod într-o funcție și să îl faci să returneze fals de îndată ce ajunge la partea unde se află comentariul
Răspunsul #4
Cu jQuery poți folosi:
$.isEmptyObject(obj); // Returns: Boolean
Începând cu jQuery 1.4, această metodă verifică atât proprietățile obiectului în sine, cât și proprietățile moștenite de la prototipuri (în sensul că nu folosește hasOwnProperty).
Cu ECMAScript ediția a 5-a în browsere moderne (IE9+, FF4+, Chrome5+, Opera12+, Safari5+) puteți folosi metoda încorporată Object.keys:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
Sau JavaScript simplu și vechi:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
Răspunsul #5
Cele mai recente browsere (și node.js) suportă Object.keys(), care returnează un array cu toate cheile din obiectul tău literal, astfel că ai putea face următoarele:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
Suport pentru browsere: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/ro/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Răspunsul #6
Dacă folosești underscore.js, atunci poți folosi funcția _.isEmpty:
var obj = {};
var emptyObject = _.isEmpty(obj);
Răspunsul #7
Dacă sunteți dispus să folosiți lodash, puteți folosi metoda some.
_.some(obj) // returns true or false
Vezi acest mic exemplu jsbin
