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.

3voto

Eduardo Cuomo Punkte 15791

Eigentum

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

Verwenden Sie

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4

1 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.

3voto

Sheelpriy Punkte 1645

Mit dem in ECMAScript 6 eingebauten Reflect-Objekt können Sie die Eigenschaften eines Objekts einfach zählen:

Reflect.ownKeys(targetObject).length

Sie gibt Ihnen die Länge der eigenen Eigenschaften des Zielobjekts ( wichtig ).

Reflect.ownKeys(target)

Gibt ein Array der eigenen (nicht geerbten) Eigenschaften des Zielobjekts Schlüssel.

Was bedeutet das nun? Um das zu erklären, sehen wir uns dieses Beispiel an.

function Person(name, age){
  this.name = name;
  this.age = age;
}

Person.prototype.getIntro= function() {
  return `${this.name} is ${this.age} years old!!`
}

let student = new Person('Anuj', 11);

console.log(Reflect.ownKeys(student).length) // 2
console.log(student.getIntro()) // Anuj is 11 years old!!

Wie Sie hier sehen können, werden nur die eigenen Eigenschaften zurückgegeben, während das Objekt die Eigenschaften noch von seinem Elternteil erbt.

Weitere Informationen finden Sie hier: Reflect-API

3voto

Eric Anderson Punkte 3574

Im Folgenden finden Sie eine Version von James Coglans Antwort in CoffeeScript für diejenigen, die JavaScript aufgegeben haben :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

2 Stimmen

Sie wollten wahrscheinlich sagen size++ for own key of obj ( own key als Syntax-Zucker in CoffeeScript). Verwendung von hasOwnProperty direkt aus dem Objekt ist gefährlich, da es bricht, wenn Objekt tatsächlich solche Eigenschaft hat.

2 Stimmen

Der OP hat nicht nach einer CoffeeScript-Version gefragt, und sie ist auch nicht als solche gekennzeichnet. Dies ist nicht eine gültige Antwort auf die Frage.

2voto

Shashwat Gupta Punkte 4257

Einfacher Einzeiler:

console.log(Object.values({id:"1",age:23,role_number:90}).length);

2voto

Ron Sims II Punkte 546

Wie bei den meisten JavaScript-Problemen gibt es auch hier viele Lösungen. Sie könnten das Object erweitern, das auf Gedeih und Verderb wie das Dictionary vieler anderer Sprachen funktioniert (+ Bürger erster Klasse). Daran ist nichts auszusetzen, aber eine andere Möglichkeit ist, ein neues Objekt zu konstruieren, das Ihren speziellen Anforderungen entspricht.

function uberject(obj){
    this._count = 0;
    for(var param in obj){
        this[param] = obj[param];
        this._count++;
    }
}

uberject.prototype.getLength = function(){
    return this._count;
};

var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());

0 Stimmen

Den Prototyp nicht verändern :)

3 Stimmen

Durch die Änderung des Prototyps einer Fabrikfunktion können Sie diese erweitern.

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