Frage

Gibt es eine Möglichkeit (von irgendwo) die Anzahl der Elemente in einem JavaScript-Objekt zu bekommen ?? (Das heißt mit konstanter Zeitkomplexität).

Ich kann nicht eine Eigenschaft oder eine Methode finden, die diese Informationen abzurufen. Bisher kann ich denke, nur eine Iteration durch die ganze Sammlung zu tun, aber das ist die lineare Zeit.
Es ist seltsam, es auf die Größe des Objekts kein direkter Zugriff ist, müssen Sie nicht denken.

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

var obj = new Object ;
War es hilfreich?

Lösung

Obwohl JS Implementierungen Spur eines solchen Wert intern halten könnte, gibt es keine Standard-Weg, es zu erhalten.

In der Vergangenheit Mozillas Javascript-Variante ausgesetzt nicht -Standard __count__ , aber es hat mit der Version 1.8.5 entfernt worden ist.

Für Cross-Browser-Scripting Sie mit explizit Iterieren über die Eigenschaften stecken und Überprüfung hasOwnProperty():

function countProperties(obj) {
    var count = 0;

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

    return count;
}

Bei ECMAScript 5 in der Lage Implementierungen kann dies auch geschrieben werden (großes Lob an Avi Flax )

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

Beachten Sie, dass Sie auch Eigenschaften vermissen, die nicht abzählbar sind (zB ein length des Arrays).

Wenn Sie mit einem Framework wie jQuery, Prototype, Mootools, $, was auch immer-den-neuen-Hype, überprüfen, ob sie mit ihrem eigenen Sammlungen API kommen, das eine bessere Lösung für Ihr Problem sein könnte als die Verwendung von nativen JS Objekten .

Andere Tipps

Um dies zu tun, in jeder ES5-kompatibelen Umgebung

Object.keys(obj).length

(Browser-Unterstützung von hier )
(Doc auf Object.keys hier enthält Methode, die Sie hinzufügen können, In dem nicht-ECMA5 Browser)

, wenn Sie verwenden jQuery bereits in Ihrem Build gerade dies zu tun:

$(yourObject).length

Es funktioniert für mich schön auf Objekte, und ich hatte bereits jQuery als Abhängung.

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);

AFAIK, gibt es keine Möglichkeit, dies zuverlässig zu tun, es sei denn, Sie zu einem Array wechseln. Welche ehrlich, nicht seltsam erscheinen -. Es ist, scheint mir ziemlich geradlinig, dass Arrays sind zählbar, und Objekte sind nicht

Wahrscheinlich in der Nähe erhalten Sie, ist so etwas wie diese

// 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

Aber das schafft Probleme, oder zumindest Fragen. Alle Benutzer erstellte Objekte gezählt werden, einschließlich der _length Funktion selbst! Und während in diesem einfachen Beispiel, das Sie es nur durch Verwendung einer normale Funktion vermeiden könnten, das bedeutet nicht, dass Sie andere Skripte zu tun, dies zu stoppen. also, was machst du? Ignorieren-Funktion Eigenschaften?

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

Am Ende denke ich, dass Sie wahrscheinlich die Idee Graben sollten Ihre Objekte zählbar und herauszufinden, einen anderen Weg, um zu tun, was es ist du tust.

Das Konzept der Anzahl / Länge / Dimensionalität nicht wirklich Sinn für ein Objekt zu machen, und um es schlägt vor, Sie wirklich ein Array mir wollen.

Edit: mir Weist darauf hin, dass Sie einen O wollen (1) für diesen. Zum besten meines Wissens keine solche Art und Weise existiert fürchte ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top