Die Standard-Implementierung von Object ( ES5.1 Objektinterne Eigenschaften und Methoden ) erfordert keine Object
um die Anzahl der Schlüssel/Eigenschaften zu verfolgen, daher sollte es keinen Standardweg geben, um die Größe einer Object
ohne explizit oder implizit über seine Schlüssel zu iterieren.
Hier sind also die am häufigsten verwendeten Alternativen:
1. ECMAScript's Object.keys()
Object.keys(obj).length;
Werke von intern iteriert über die Schlüssel, um ein temporäres Array zu berechnen, und gibt dessen Länge zurück.
- Profis - Lesbare und saubere Syntax. Keine Bibliothek oder benutzerdefinierter Code erforderlich, außer einem Shim, wenn keine native Unterstützung verfügbar ist
- Nachteile - Speicher-Overhead durch die Erstellung des Arrays.
2. Bibliotheksbasierte Lösungen
Viele Beispiele aus Bibliotheken, die an anderer Stelle in diesem Thema beschrieben werden, sind im Kontext ihrer Bibliothek nützliche Idiome. Vom Standpunkt der Leistung aus gesehen, gibt es jedoch nichts zu gewinnen im Vergleich zu einem perfekten bibliotheksfreien Code, da alle diese Bibliotheksmethoden entweder eine for-Schleife oder ES5 Object.keys
(nativ oder mit Shimmings).
3. Optimieren einer for-Schleife
El langsamste Stelle einer solchen for-Schleife ist im Allgemeinen die .hasOwnProperty()
wegen des Overheads der Funktionsaufrufe. Wenn ich also nur die Anzahl der Einträge eines JSON-Objekts wissen will, überspringe ich einfach die .hasOwnProperty()
aufzurufen, wenn ich weiß, dass kein Code die Object.prototype
.
Andernfalls könnte Ihr Code sehr leicht optimiert werden, indem Sie k
lokal ( var k
) und durch Verwendung des Präfix-Inkrement-Operators ( ++count
) anstelle von Postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Eine andere Idee beruht auf der Zwischenspeicherung 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 Benchmarkings. Es ist ohnehin nur ein sehr begrenzter Leistungsgewinn zu erwarten.