2921 Stimmen

Länge eines JavaScript-Objekts

Ich habe ein JavaScript-Objekt. Gibt es eine eingebaute oder akzeptierte bewährte Methode, um die Länge dieses Objekts zu ermitteln?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

1 Stimmen

@neitony - das ist irgendwie wahr, aber so viele Leute sind an PHP's "assoziatives Array" gewöhnt, dass sie annehmen könnten, es bedeutet " bestellt assoziative Karte", wenn JS-Objekte in der Tat ungeordnet sind.

4 Stimmen

In dem obigen Beispiel ist myObject.length undefiniert, zumindest in einer Browserumgebung. Deshalb ist es ungültig, @AdrianM

3 Stimmen

Varianten von Object. { keys , values , entries } (obj).length wurden nun insgesamt 38 Mal in 16 Antworten und in den Kommentaren zu dieser Frage erwähnt, und weitere 11 Mal in 7 gelöschten Antworten. Ich denke, das ist jetzt genug.

6voto

Pian0_M4n Punkte 2413

Sie können immer tun Object.getOwnPropertyNames(myObject).length um das gleiche Ergebnis zu erzielen wie [].length für ein normales Array ergeben würde.

1 Stimmen

Object.keys() gibt ein Array zurück, das nur die Namen der Eigenschaften enthält, die aufzählbar sind. Wenn Sie ein Array mit ALLEN Eigenschaften wünschen, sollten Sie Object.getOwnPropertyNames() stattdessen. Siehe developer.mozilla.org/de/docs/Web/JavaScript/Reference/

3 Stimmen

Was ist der Unterschied zu aeosynths Antwort ?

6voto

Sherzod Punkte 4741

Hier ist eine andere Version der Antwort von James Cogan. Anstatt ein Argument zu übergeben, können Sie einfach einen Prototyp der Klasse Object erstellen und den Code sauberer gestalten.

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle Beispiel: http://jsfiddle.net/qar4j/1/

6 Stimmen

Object.prototype - schlechte Idee.

0 Stimmen

@tborychowski Können Sie bitte erklären, warum?

0 Stimmen

Hier ist ein Artikel: bit.ly/1droWrG . Ich sage nicht, dass man es nicht tun darf, sondern nur, dass man alle Auswirkungen kennen muss, bevor man es tut.

5voto

Mystical Punkte 2064

Sie können einfach Folgendes verwenden Object.keys(obj).length auf ein beliebiges Objekt, um dessen Länge zu ermitteln. Object.keys gibt ein Array mit allen Objekten zurück Tasten (Eigenschaften), was sich als nützlich erweisen kann, um die Länge dieses Objekts anhand der Länge des entsprechenden Arrays zu ermitteln. Sie können sogar eine Funktion für diese. Lassen Sie uns kreativ und schreiben eine Methode für sie als auch (zusammen mit einer bequemeren getter Eigenschaft):

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

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()

4 Stimmen

Was ist der Unterschied zu aeosynths Antwort ?

0 Stimmen

Es ist, weil es zeigt, wie man es als eine Funktion und ein globales Objekt Methode (mehr objektorientiert und verwendet eine Form der Kapselung) zu machen; jedoch aeosynths Antwort nicht.

0 Stimmen

Wenn Sie eingebaute Prototypen erweitern oder eine Eigenschaft polyfillen (d.h. monkey-patch), machen Sie es bitte richtig: für Vorwärtskompatibilität, prüfen Sie zuerst, ob die Eigenschaft existiert, dann machen Sie die Eigenschaft nicht aufzählbar, so dass die eigenen Schlüssel der konstruierten Objekte nicht verschmutzt werden. Für Methoden verwenden Sie aktuell Methoden . Meine Empfehlung: Folgen Sie diese Beispiele die zeigen, wie man eine Methode hinzufügt, die sich möglichst ähnlich wie eingebaute Methoden verhält.

4voto

MacroMan Punkte 1981

Eine gute Möglichkeit, dies zu erreichen (nur Internet Explorer 9+), ist die Definition eines magischen Getters für die Eigenschaft length:

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

Und Sie können es einfach so verwenden:

var myObj = { 'key': 'value' };
myObj.length;

Es würde die 1 .

2 Stimmen

Abgesehen von den Argumenten gegen Prototyp-Modifikationen habe ich persönlich noch NIE einen Fehler gehabt, der dadurch verursacht wurde, und für mich ist das eine der Stärken von JavaScript.

3voto

Rashed Rahat Punkte 1985

Versuchen Sie es: Object.values(theObject).length

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.log(Object.values(myObject).length);

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