web-dev-qa-db-de.com

Anzahl der Elemente in einem Javascript-Objekt

Gibt es eine Möglichkeit, die Anzahl der Elemente in einem Javascript-Objekt (von irgendwoher) zu ermitteln? (d. h. zeitlich konstante Komplexität).

Ich kann keine Eigenschaft oder Methode finden, die diese Informationen abruft. Bisher kann ich nur daran denken, eine Iteration durch die gesamte Sammlung durchzuführen, aber das ist eine lineare Zeit.
Es ist seltsam, dass es keinen direkten Zugriff auf die Größe des Objekts gibt.

EDIT:
Ich spreche über das Objekt Object (keine Objekte im Allgemeinen):

var obj = new Object ;
95
GetFree

Obwohl JS-Implementierungen einen solchen Wert möglicherweise intern verfolgen, gibt es keine Standardmethode, um ihn abzurufen.

In der Vergangenheit enthüllte Mozillas Javascript-Variante das nicht-standardmäßige __count__ , aber es wurde mit Version 1.8.5 entfernt.

Bei browserübergreifenden Skripten müssen Sie die Eigenschaften nicht explizit durchlaufen und hasOwnProperty() überprüfen:

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

Im Falle von ECMAScript 5-fähigen Implementierungen kann dies auch als (Kudos to Avi Flax ) geschrieben werden.

function countProperties(obj) {
    return Object.keys(obj).length;
}

Denken Sie daran, dass Sie auch Eigenschaften vermissen, die nicht aufzählbar sind (z. B. das length eines Arrays).

Wenn Sie ein Framework wie jQuery, Prototype, Mootools oder $ whatever-the-newest-hype verwenden, prüfen Sie, ob diese mit einer eigenen API für Sammlungen ausgestattet sind. Dies ist möglicherweise eine bessere Lösung für Ihr Problem als die Verwendung nativer JS-Objekte.

143
Christoph

Dies kann in jeder ES5-kompatiblen Umgebung durchgeführt werden

Object.keys(obj).length

(Browser-Unterstützung von hier )
(Doc on Object.keys hier , enthält eine Methode, die Sie zu Nicht-ECMA5-Browsern hinzufügen können)

86
ZelkiN

if Sie verwenden bereits jQuery in Ihrem Build.

$(yourObject).length

Es funktioniert gut für mich auf Objekten, und ich hatte bereits jQuery als Abhängigkeit.

11
IndelibleHeff
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);
5
kennebec

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

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Dies schafft jedoch Probleme oder zumindest Fragen. Alle vom Benutzer erstellten Eigenschaften werden gezählt, einschließlich der _length-Funktion selbst! In diesem einfachen Beispiel können Sie dies vermeiden, indem Sie lediglich eine normale Funktion verwenden. Dies bedeutet jedoch nicht, dass Sie andere Skripts daran hindern können, dies zu tun. also, was machst du? Funktionseigenschaften ignorieren?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

Letztendlich denke ich, Sie sollten die Idee, Ihre Objekte abzählbar zu machen und eine andere Möglichkeit zu finden, um das zu tun, was Sie tun.

2
Peter Bailey

Das Konzept von Anzahl/Länge/Dimensionalität ist für ein Objekt nicht wirklich sinnvoll, und wenn man es braucht, möchte man mir wirklich ein Array geben.

Edit: Hat mich darauf hingewiesen, dass du dafür ein O(1) möchtest. Nach meinem besten Wissen gibt es keinen solchen Weg, fürchte ich.

1
annakata