2001 Stimmen

Wie man effizient die Anzahl der Schlüssel/Eigenschaften eines Objekts in JavaScript zählt

Wie kann man am schnellsten die Anzahl der Schlüssel/Eigenschaften eines Objekts zählen? Ist es möglich, dies zu tun, ohne über das Objekt zu iterieren? D.h., ohne zu tun:

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;

(Firefox hat eine magische __count__ Eigenschaft, aber diese wurde irgendwann in Version 4 entfernt).

3156voto

Avi Flax Punkte 48869

Um dies in jedem _ES5 -kompatible Umgebung_ , wie zum Beispiel Node.js , Chrom, Internet Explorer 9+ , Firefox 4+, oder Safari 5+:

Object.keys(obj).length

164voto

Renaat De Muynck Punkte 3056

Sie könnten diesen Code verwenden:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

Dann können Sie diese auch in älteren Browsern verwenden:

var len = Object.keys(obj).length;

143voto

studgeek Punkte 13264

Wenn Sie Folgendes verwenden Underscore.js können Sie _.size ( danke douwe ):

_.size(obj)

Alternativ dazu können Sie auch _.Schlüssel was für manche vielleicht klarer ist:

_.keys(obj).length

Ich empfehle Underscore.js sehr. Es ist eine enge Bibliothek für viele grundlegende Dinge zu tun. Wann immer möglich, passen sie ECMAScript 5 und auf die native Implementierung zu verweisen.

Ansonsten unterstütze ich Avi Flax' Antwort . Ich habe ihn bearbeitet und einen Link zur MDC Dokumentation, die die keys()-Methode enthält, die Sie zu Nicht-ECMAScript-5-Browsern hinzufügen können.

101voto

Steve Cooper Punkte 18836

Hier sind einige Leistungstests für drei Methoden;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys().length

20,735 Operationen pro Sekunde

Es ist sehr einfach und kompatibel und läuft schnell sondern teuer, da ein neues Array von Schlüsseln erstellt wird, das dann weggeworfen wird.

return Object.keys(objectToRead).length;

Schleife durch die Tasten

15,734 Operationen pro Sekunde

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

Es ist etwas langsamer, aber nicht annähernd so speicherintensiv, so dass es wahrscheinlich besser ist, wenn Sie für mobile oder andere kleine Rechner optimieren wollen.

Map anstelle von Object verwenden

953,839,338 Operationen pro Sekunde

return mapToRead.size;

Im Grunde verfolgt Map seine eigene Größe, also geben wir nur ein Zahlenfeld zurück. Es ist viel, viel schneller als jede andere Methode. Wenn Sie die Kontrolle über das Objekt haben, konvertieren Sie sie stattdessen in Maps.

97voto

Luc125 Punkte 5585

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X