Die Standardobjektimplementierung ( ES5.1 Objektinterne Eigenschaften und Methoden ) erfordert keine Object
Verfolgung der Anzahl der Schlüssel / Eigenschaften. Daher sollte es keine Standardmethode geben, um die Größe einer zu bestimmen, Object
ohne explizit oder implizit über ihre Schlüssel zu iterieren.
Hier sind die am häufigsten verwendeten Alternativen:
1. Object.keys () von ECMAScript
Object.keys(obj).length;
Funktioniert durch internes Durchlaufen der Schlüssel, um ein temporäres Array zu berechnen und dessen Länge zurückzugeben.
- Vorteile - Lesbare und saubere Syntax. Keine Bibliothek oder benutzerdefinierter Code erforderlich, außer einem Shim, wenn keine native Unterstützung verfügbar ist
- Nachteile - Speicheraufwand aufgrund der Erstellung des Arrays.
2. Bibliotheksbasierte Lösungen
Viele bibliotheksbasierte Beispiele an anderer Stelle in diesem Thema sind nützliche Redewendungen im Kontext ihrer Bibliothek. Unter dem Gesichtspunkt der Leistung gibt es jedoch nichts zu gewinnen im Vergleich zu einem perfekten Code ohne Bibliothek, da alle diese Bibliotheksmethoden entweder eine for-Schleife oder ES5 Object.keys
(nativ oder shimmed) enthalten.
3. Optimieren einer for-Schleife
Der langsamste Teil einer solchen for-Schleife ist .hasOwnProperty()
aufgrund des Funktionsaufrufaufwands im Allgemeinen der Aufruf. Wenn ich also nur die Anzahl der Einträge eines JSON-Objekts möchte, überspringe ich den .hasOwnProperty()
Aufruf, wenn ich weiß, dass kein Code erweitert wurde oder wird Object.prototype
.
Andernfalls könnte Ihr Code geringfügig optimiert werden, indem Sie k
local ( var k
) erstellen und ++count
anstelle von postfix den Präfix-Inkrement-Operator ( ) verwenden.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Eine andere Idee beruht auf dem Zwischenspeichern der hasOwnProperty
Methode:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Ob dies in einer bestimmten Umgebung schneller ist oder nicht, ist eine Frage des Benchmarking. Es ist ohnehin ein sehr begrenzter Leistungsgewinn zu erwarten.