2001 Stimmen

Wie man effizient die Anzahl der Schlüssel/Eigenschaften eines Objekts in JavaScript zählt

Wie kann man am schnellsten die Anzahl der Schlüssel/Eigenschaften eines Objekts zählen? Ist es möglich, dies zu tun, ohne über das Objekt zu iterieren? D.h., ohne zu tun:

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;

(Firefox hat eine magische __count__ Eigenschaft, aber diese wurde irgendwann in Version 4 entfernt).

15voto

Luke Bennett Punkte 32186

Mir ist keine Möglichkeit bekannt, dies zu tun. Um jedoch die Iterationen auf ein Minimum zu beschränken, könnten Sie versuchen, auf die Existenz von __count__ und wenn es nicht existiert (d.h. nicht Firefox), können Sie über das Objekt iterieren und es für die spätere Verwendung definieren, z.B.:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

Auf diese Weise kann jeder Browser, der __count__ verwenden würde, und Iterationen würden nur für diejenigen durchgeführt, die dies nicht tun. Wenn sich die Anzahl ändert und Sie dies nicht tun können, können Sie jederzeit eine Funktion daraus machen:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

Auf diese Weise können Sie jedes Mal, wenn Sie auf myobj. __count__ wird die Funktion ausgelöst und neu berechnet.

9voto

lepe Punkte 23471

Desde _Object.defineProperty()_ :

Object.defineProperty(obj, prop, descriptor)

Sie können es entweder allen Ihren Objekten hinzufügen:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

Oder ein einzelnes Objekt:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

Beispiel:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; // Output: 2

Auf diese Weise hinzugefügt, wird es nicht angezeigt in für in Schleifen:

for(var i in myObj) {
    console.log(i + ": " + myObj[i]);
}

Ausgabe:

name: John Doe
email: leaked@example.com

Hinweis: Es funktioniert nicht in Browsern vor Internet Explorer 9 .

8voto

hakunin Punkte 3853

Für diejenigen, die Underscore.js in ihrem Projekt enthalten haben, können Sie dies tun:

_({a:'', b:''}).size() // => 2

oder funktionalen Stil:

_.size({a:'', b:''}) // => 2

6voto

Ali Punkte 248006

Ich habe dieses Problem gelöst, indem ich meine eigene Implementierung einer einfachen Liste erstellt habe, die aufzeichnet, wie viele Elemente in dem Objekt gespeichert sind. Es ist sehr einfach. Etwas wie dies:

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}

4voto

Mark Rhodes Punkte 9675

Für diejenigen, die Ext JS 4 in ihrem Projekt, können Sie tun:

Ext.Object.getSize(myobj);

Dies hat den Vorteil, dass es auf allen Ext JS-kompatiblen Browsern funktioniert ( Internet Explorer 6 - Internet Explorer 8 enthalten). Ich glaube jedoch, dass die Laufzeit nicht besser als O(n) ist, wie bei anderen vorgeschlagenen Lösungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X