Frage Anzahl der Elemente in einem JavaScript-Objekt


Gibt es eine Möglichkeit, die Anzahl der Elemente in einem JavaScript-Objekt (von irgendwo) zu bekommen? (d. h. konstante Zeitkomplexität).

Ich kann keine Eigenschaft oder Methode finden, die diese Informationen abrufen. Bisher kann ich nur an eine Iteration durch die ganze Sammlung denken, aber das ist lineare Zeit.
Es ist seltsam, dass es keinen direkten Zugriff auf die Größe des Objekts gibt, denkst du nicht.

BEARBEITEN:
Ich rede von der Object Objekt (nicht Objekte im Allgemeinen):

var obj = new Object ;

80
2018-06-05 16:05


Ursprung


Antworten:


JS-Implementierungen können zwar intern einen solchen Wert verfolgen, es gibt jedoch keine Standardmethode, um einen solchen Wert zu ermitteln.

In der Vergangenheit hat Mozillas Javascript-Variante den Nicht-Standard __count__, aber es wurde mit Version 1.8.5 entfernt.

Bei browserübergreifendem Scripting müssen Sie die Eigenschaften und die Überprüfung explizit durchlaufen hasOwnProperty():

function countProperties(obj) {
    var count = 0;

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

    return count;
}

Im Fall von ECMAScript 5-fähigen Implementierungen kann dies auch als (Kudos to Avi Flachs)

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

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

Wenn Sie ein Framework wie jQuery, Prototype, Mootools, $ whatever-the-nearest-hype verwenden, prüfen Sie, ob sie mit ihrer eigenen Collections-API ausgeliefert werden, was eine bessere Lösung für Ihr Problem darstellt als die Verwendung nativer JS-Objekte.


122
2018-06-05 16:35



Um dies in einer ES5-kompatiblen Umgebung zu tun

Object.keys(obj).length

(Browserunterstützung von Hier)
(Doc auf Object.keys Hier, enthält Methode, die Sie zu Nicht-ECMA5-Browsern hinzufügen können)


67
2018-03-15 09:03



ob Sie verwenden bereits jQuery in Ihrem Build tun Sie dies einfach:

$(yourObject).length

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


13
2017-12-02 14:12



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

6
2018-06-05 17:02



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

Wahrscheinlich ist das nächste, was du bekommst, etwas Ähnliches

// 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 vom Benutzer erstellten Eigenschaften werden gezählt, einschließlich der _length-Funktion selbst! Und während Sie in diesem einfachen Beispiel die Verwendung einer normalen Funktion vermeiden können, bedeutet dies nicht, dass Sie andere Skripte davon abhalten können. 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

Am Ende denke ich, dass Sie wahrscheinlich die Idee aufgeben sollten, Ihre Objekte zählbar zu machen und einen anderen Weg zu finden, um das zu tun, was auch immer Sie tun.


2
2018-06-05 16:27



Das Konzept der Anzahl / Länge / Dimensionalität macht keinen Sinn für ein Objekt, und wenn es benötigt wird, deutet das darauf hin, dass du wirklich ein Array für mich haben willst.

Edit: Zeigen Sie mir, dass Sie ein O (1) dafür wollen. Soweit ich weiß, gibt es keinen solchen Weg, fürchte ich.


1
2018-06-05 16:21



Sie können verwenden:

({ foo:55, bar:99 }).__count__ // is: 2

wurde aus genommen Hier


0
2018-06-05 17:10