Gibt es eine Möglichkeit, (von irgendwoher) die Anzahl der Elemente in einem Javascript-Objekt zu ermitteln? (dh zeitkonstante Komplexität).
Ich kann keine Eigenschaft oder Methode finden, die diese Informationen abruft. Bisher kann ich nur daran denken, die gesamte Sammlung zu iterieren, aber das ist lineare Zeit.
Es ist seltsam, dass es keinen direkten Zugriff auf die Größe des Objekts gibt.
EDIT:
Ich spreche über das Object
Objekt (nicht Objekte im Allgemeinen):
var obj = new Object ;
Antworten:
Obwohl JS-Implementierungen einen solchen Wert möglicherweise intern verfolgen, gibt es keinen Standardweg, um ihn abzurufen.
In der Vergangenheit hat Mozillas Javascript-Variante den Nicht-Standard
__count__
verfügbar gemacht, wurde jedoch mit Version 1.8.5 entfernt.Bei Cross-Browser-Skripten müssen Sie die Eigenschaften nicht explizit durchlaufen und Folgendes überprüfen
hasOwnProperty()
:Bei ECMAScript 5-fähigen Implementierungen kann dies auch als (Kudos to Avi Flax ) geschrieben werden.
Denken Sie daran, dass Sie auch Eigenschaften vermissen, die nicht aufzählbar sind (z. B. die eines Arrays
length
).Wenn Sie ein Framework wie jQuery, Prototype, Mootools oder $ Whatever-the-Recent-Hype verwenden, prüfen Sie, ob diese über eine eigene Sammlungs-API verfügen. Dies ist möglicherweise eine bessere Lösung für Ihr Problem als die Verwendung nativer JS-Objekte.
quelle
__count__
ist weg :(hasOwnProperty()
?Dazu in jeder ES5-kompatiblen Umgebung
( Browserunterstützung von hier )
(Doc on Object.keys hier , enthält eine Methode, die Sie Nicht-ECMA5-Browsern hinzufügen können.)
quelle
Wenn Sie jQuery bereits in Ihrem Build verwenden, gehen Sie wie folgt vor:
Es funktioniert gut für mich bei Objekten, und ich hatte jQuery bereits als Abhängigkeit.
quelle
quelle
AFAIK, es gibt keine Möglichkeit, dies zuverlässig zu tun, es sei denn, Sie wechseln zu einem Array. Was ehrlich gesagt nicht seltsam erscheint - es scheint mir ziemlich einfach zu sein, dass Arrays zählbar sind und Objekte nicht.
Wahrscheinlich ist der nächste, den Sie bekommen, so etwas
Dies schafft jedoch Probleme oder zumindest Fragen. Alle vom Benutzer erstellten Eigenschaften werden gezählt, einschließlich der Funktion _length selbst! In diesem einfachen Beispiel können Sie dies vermeiden, indem Sie nur eine normale Funktion verwenden. Dies bedeutet jedoch nicht, dass Sie andere Skripte daran hindern können, dies zu tun. also, was machst du? Funktionseigenschaften ignorieren?
Am Ende denke ich, Sie sollten wahrscheinlich die Idee aufgeben, Ihre Objekte zählbar zu machen und einen anderen Weg finden, um das zu tun, was Sie gerade tun.
quelle
Das Konzept von Zahl / Länge / Dimensionalität ist für ein Objekt nicht wirklich sinnvoll, und wenn Sie es benötigen, möchten Sie mir wirklich ein Array.
Edit: Hat mich darauf hingewiesen, dass du dafür ein O (1) willst. Nach meinem besten Wissen gibt es leider keinen solchen Weg.
quelle