Aktualisierte Antwort
Hier ist ein Update von 2016 und breiter Einsatz von ES5 und darüber hinaus. Für IE9+ und alle anderen modernen ES5+-fähigen Browser können Sie Object.keys()
so dass der obige Code einfach wird:
var size = Object.keys(myObj).length;
Dabei muss kein bestehender Prototyp geändert werden, da Object.keys()
ist jetzt eingebaut.
bearbeiten : Objekte können symbolische Eigenschaften haben, die nicht über die Methode Object.key zurückgegeben werden können. Die Antwort wäre also unvollständig, ohne sie zu erwähnen.
Der Symboltyp wurde der Sprache hinzugefügt, um eindeutige Bezeichner für Objekteigenschaften zu schaffen. Der Hauptvorteil des Typs Symbol ist die Vermeidung von Überschreibungen.
Object.keys
o Object.getOwnPropertyNames
funktioniert nicht für symbolische Eigenschaften. Um sie zurückzugeben, müssen Sie 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
Ältere Antwort
Die solideste Antwort (d.h. die die Absicht dessen, was Sie zu tun versuchen, erfasst und gleichzeitig die wenigsten Fehler verursacht) wäre:
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
const myObj = {}
var size = Object.size(myObj);
In JavaScript gibt es eine Art Konvention, dass man fügen Sie keine Dinge zu Object.prototype hinzu weil es Aufzählungen in verschiedenen Bibliotheken unterbrechen kann. Das Hinzufügen von Methoden zu Object ist jedoch normalerweise sicher.
1 Stimmen
@neitony - das ist irgendwie wahr, aber so viele Leute sind an PHP's "assoziatives Array" gewöhnt, dass sie annehmen könnten, es bedeutet " bestellt assoziative Karte", wenn JS-Objekte in der Tat ungeordnet sind.
4 Stimmen
In dem obigen Beispiel ist myObject.length undefiniert, zumindest in einer Browserumgebung. Deshalb ist es ungültig, @AdrianM
3 Stimmen
Varianten von
Object.
{keys
,values
,entries
}(obj).length
wurden nun insgesamt 38 Mal in 16 Antworten und in den Kommentaren zu dieser Frage erwähnt, und weitere 11 Mal in 7 gelöschten Antworten. Ich denke, das ist jetzt genug.