La risposta più efficace (ovvero che cattura l'intento di ciò che stai cercando di fare causando il minor numero di bug) sarebbe:
Object.size = function(obj) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
// Get the size of an object
var size = Object.size(myObj);
C'è una sorta di convenzione in JavaScript che non aggiunge cose a Object.prototype , perché può interrompere le enumerazioni in varie librerie. Tuttavia, l'aggiunta di metodi a Object è generalmente sicura.
Ecco un aggiornamento a partire dal 2016 e un'implementazione diffusa di ES5 e oltre. Per IE9 + e tutti gli altri moderni browser compatibili con ES5 +, è possibile utilizzare in Object.keys()
modo che il codice sopra riportato diventi:
var size = Object.keys(myObj).length;
Questo non deve modificare alcun prototipo esistente poiché Object.keys()
è ora incorporato.
Modifica : gli oggetti possono avere proprietà simboliche che non possono essere restituite tramite il metodo Object.key. Quindi la risposta sarebbe incompleta senza menzionarli.
Il tipo di simbolo è stato aggiunto al linguaggio per creare identificatori univoci per le proprietà degli oggetti. Il principale vantaggio del tipo di simbolo è la prevenzione delle sovrascritture.
Object.keys
o Object.getOwnPropertyNames
non funziona per le proprietà simboliche. Per restituirli è necessario utilizzare Object.getOwnPropertySymbols
.
var person = {
[Symbol('name')]: 'John Doe',
[Symbol('age')]: 33,
"occupation": "Programmer"
};
const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1
let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2