Ich habe ein JavaScript-Objekt. Gibt es eine integrierte oder akzeptierte Best-Practice-Methode, um die Länge dieses Objekts zu ermitteln?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
quelle
quelle
Object.keys(obj).length
Antworten:
Die robusteste Antwort (dh sie erfasst die Absicht dessen, was Sie versuchen, während Sie die wenigsten Fehler verursachen) wäre:
In JavaScript gibt es eine Art Konvention, nach der Sie Object.prototype keine Elemente hinzufügen , da dadurch Aufzählungen in verschiedenen Bibliotheken unterbrochen werden können. Das Hinzufügen von Methoden zu Object ist jedoch normalerweise sicher.
Hier ist ein Update ab 2016 und eine weit verbreitete Bereitstellung von ES5 und darüber hinaus. Für IE9 + und alle anderen modernen ES5 + -fähigen Browser können Sie Folgendes verwenden:
Object.keys()
Der obige Code lautet wie folgt :Dies muss keinen vorhandenen Prototyp ändern, da dieser
Object.keys()
jetzt eingebaut ist.Bearbeiten : Objekte können symbolische Eigenschaften haben, die nicht über die Object.key-Methode zurückgegeben werden können. Die Antwort wäre also unvollständig, ohne sie zu erwähnen.
Der Sprache wurde ein Symboltyp hinzugefügt, um eindeutige Bezeichner für Objekteigenschaften zu erstellen. Der Hauptvorteil des Symboltyps ist die Verhinderung von Überschreibungen.
Object.keys
oderObject.getOwnPropertyNames
funktioniert nicht für symbolische Eigenschaften. Um sie zurückzugeben, müssen Sie verwendenObject.getOwnPropertySymbols
.quelle
Object.keys(obj).length
Wenn Sie wissen, dass Sie sich nicht um
hasOwnProperty
Schecks kümmern müssen , können Sie dies ganz einfach tun:quelle
Aktualisiert : Wenn Sie Underscore.js verwenden (empfohlen, es ist leicht!), Können Sie dies einfach tun
Wenn nicht und Sie aus irgendeinem Grund nicht mit den Objekteigenschaften herumspielen möchten und bereits jQuery verwenden, ist ein Plugin gleichermaßen verfügbar:
quelle
_.size()
war die perfekte Lösung für mein Meteor- Projekt, das von underscore.j unterstützt wird.Hier ist die browserübergreifendste Lösung.
Dies ist besser als die akzeptierte Antwort, da native Object.keys verwendet werden, falls vorhanden. Somit ist es das schnellste für alle modernen Browser.
quelle
Object.keys()
Gibt ein Array zurück, das nur die Namen der aufzählbaren Eigenschaften enthält. Wenn Sie ein Array mit ALLEN Eigenschaften möchten, sollten SieObject.getOwnPropertyNames()
stattdessen verwenden. Siehe developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Ich bin kein JavaScript-Experte, aber es sieht so aus, als müssten Sie die Elemente durchlaufen und zählen, da Object keine Längenmethode hat:
@palmsey: Aus Gründen der Fairness gegenüber dem OP bezieht sich die JavaScript-Dokumentation explizit auf die Verwendung von Variablen vom Typ Object auf diese Weise als "assoziative Arrays".
quelle
Diese Methode ruft alle Eigenschaftsnamen Ihres Objekts in einem Array ab, sodass Sie die Länge dieses Arrays ermitteln können, die der Schlüssellänge Ihres Objekts entspricht.
quelle
Um sich nicht mit dem Prototyp oder anderem Code herumzuschlagen, können Sie Ihr eigenes Objekt erstellen und erweitern:
Wenn Sie immer die Methode add verwenden, ist die Eigenschaft length korrekt. Wenn Sie befürchten, dass Sie oder andere die Verwendung vergessen, können Sie den Eigenschaftszähler, den die anderen zur Längenmethode gepostet haben, ebenfalls hinzufügen.
Natürlich können Sie die Methoden jederzeit überschreiben. Aber selbst wenn Sie dies tun, würde Ihr Code wahrscheinlich merklich versagen, was das Debuggen erleichtert. ;)
quelle
So und vergessen Sie nicht zu überprüfen, ob sich die Eigenschaft nicht in der Prototypenkette befindet:
quelle
Verwenden Sie dies einfach, um Folgendes zu erhalten
length
:quelle
myArray
Hier ist eine völlig andere Lösung, die nur in moderneren Browsern funktioniert (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+).
Siehe jsFiddle
Richten Sie Ihre assoziative Array-Klasse ein
Jetzt können Sie diesen Code wie folgt verwenden ...
quelle
length
Eigenschaft verwenden. Jeder Code, der sie verwendet, muss sicherstellen, dass nicht versucht wird, sie zu speichernlength
, aber ich denke, das wäre dasselbe, wenn dies der Fall wäre ein Standard-Array auch. Das ÜberschreibenhasOwnProperty
eines Objekts würde höchstwahrscheinlich zu einem unerwünschten Ergebnis führen.Das funktioniert bei mir:
quelle
In einigen Fällen ist es besser, die Größe einfach in einer separaten Variablen zu speichern. Insbesondere, wenn Sie dem Array ein Element an einer Stelle hinzufügen und die Größe leicht erhöhen können. Es würde natürlich viel schneller funktionieren, wenn Sie die Größe häufig überprüfen müssen.
quelle
Verwenden:
quelle
Und fairerweise zu @palmsey war er ganz richtig, sie sind keine assoziativen Arrays, sie sind definitiv Objekte :) - sie erledigen die Arbeit eines assoziativen Arrays. Aber was den weiteren Punkt betrifft, so scheinen Sie nach diesem ziemlich guten Artikel, den ich gefunden habe, definitiv das Recht darauf zu haben:
JavaScript "Assoziative Arrays" als schädlich eingestuft
Aber ist die akzeptierte Antwort nach alledem nicht selbst eine schlechte Praxis?
Wenn dem Objektprototyp noch etwas hinzugefügt wurde, schlägt der vorgeschlagene Code fehl:
Ich denke nicht, dass diese Antwort die akzeptierte sein sollte, da man nicht darauf vertrauen kann, dass sie funktioniert, wenn ein anderer Code im selben Ausführungskontext ausgeführt wird. Um dies auf robuste Weise zu tun, müssten Sie sicherlich die Größenmethode in myArray definieren und den Typ der Mitglieder überprüfen, während Sie sie durchlaufen.
quelle
Wenn Sie eine assoziative Datenstruktur benötigen, die ihre Größe verfügbar macht, verwenden Sie besser eine Karte anstelle eines Objekts.
quelle
Was ist mit so etwas -
quelle
Wenn wir den Hash haben
Wir können die Länge anhand der Länge der Schlüssel ermitteln, die der Länge des Hashs entspricht:
quelle
quelle
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Wenn Sie AngularJS 1.x verwenden, können Sie die Dinge auf AngularJS-Weise ausführen, indem Sie einen Filter erstellen und den Code aus einem der anderen Beispiele wie dem folgenden verwenden:
Verwendungszweck
In Ihrem Controller:
Oder aus Ihrer Sicht:
quelle
Der einfachste Weg ist so
wobei myobject das Objekt dessen ist, was Sie die Länge wollen
quelle
Wenn Sie Internet Explorer 8 oder niedriger nicht unterstützen möchten, können Sie die Anzahl der Eigenschaften in einem Objekt leicht ermitteln, indem Sie die folgenden zwei Schritte ausführen:
Object.keys()
, um ein Array abzurufen, das nur die Namen der aufzählbaren Eigenschaften enthält, oderObject.getOwnPropertyNames()
wenn Sie auch die Namen der nicht aufzählbaren Eigenschaften einschließen möchten..length
Eigenschaft dieses Arrays.Wenn Sie dies mehrmals tun müssen, können Sie diese Logik in eine Funktion einschließen:
So verwenden Sie diese spezielle Funktion:
Siehe auch diese Geige für eine Demo.
quelle
Verwenden Sie
Object.keys(myObject).length
diese Option , um die Länge des Objekts / Arrays abzurufenquelle
quelle
Eine Variation einiger der oben genannten ist:
Es ist etwas eleganter, hasOwnProp zu integrieren.
quelle
Hier ist eine andere Version von James Cogans Antwort. Anstatt ein Argument zu übergeben, erstellen Sie einfach einen Prototyp der Object-Klasse und machen Sie den Code sauberer.
jsfiddle Beispiel: http://jsfiddle.net/qar4j/1/
quelle
Object.prototype
- schlechte Idee.Sie können einfach
Object.keys(obj).length
jedes Objekt verwenden, um seine Länge zu ermitteln. Object.keys kehrt ein Array alle Objekt enthaltenden Schlüssel (Eigenschaften) , die für die Suche nach der Länge des Objekts kann sich als nützlich , die Länge des entsprechenden Array verwendet wird . Sie können sogar eine Funktion dafür schreiben . Lassen Sie uns kreativ werden und auch eine Methode dafür schreiben (zusammen mit einer praktischeren Getter-Eigenschaft):quelle
Sie können immer
Object.getOwnPropertyNames(myObject).length
das gleiche Ergebnis[].length
erzielen, das für ein normales Array erzielt wird.quelle
Object.keys()
Gibt ein Array zurück, das nur die Namen der aufzählbaren Eigenschaften enthält. Wenn Sie ein Array mit ALLEN Eigenschaften möchten, sollten SieObject.getOwnPropertyNames()
stattdessen verwenden. Siehe developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Wir können die Länge des Objekts ermitteln, indem wir Folgendes verwenden:
quelle
Ein bisschen spät zum Spiel, aber eine gute Möglichkeit, dies zu erreichen (nur IE9 +), besteht darin, einen magischen Getter für die Längeneigenschaft zu definieren:
Und Sie können es einfach so verwenden:
Würde geben
1
.quelle
Unten finden Sie eine Version von James Coglans Antwort in CoffeeScript für diejenigen, die auf reines JavaScript verzichtet haben :)
quelle
size++ for own key of obj
(own key
Syntaxzucker in CoffeeScript). Die VerwendunghasOwnProperty
direkt vom Objekt aus ist gefährlich, da sie unterbrochen wird, wenn das Objekt tatsächlich über eine solche Eigenschaft verfügt.