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.

43voto

jj33 Punkte 7234

Ich bin kein JavaScript-Experte, aber es sieht so aus, als müssten Sie die Elemente in einer Schleife durchgehen und sie zählen, da Object keine Längenmethode hat:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: In Fairness zu den OP, die JavaScript-Dokumentation tatsächlich ausdrücklich auf die Verwendung von Variablen des Typs Object auf diese Weise als "assoziative Arrays" beziehen.

9 Stimmen

Funktioniert nicht, da auch Methoden gezählt werden, die über Prototyp hinzugefügt werden.

37voto

venkat7668 Punkte 2467

Diese Methode erhält alle Eigenschaftsnamen Ihres Objekts in einem Array, so dass Sie die Länge dieses Arrays erhalten können, die gleich der Länge der Schlüssel Ihres Objekts ist.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

1 Stimmen

@PatrickRoberts Schlüsselmethode gibt keine Eigenschaften aus der Prototypenkette zurück. Warum also die Notwendigkeit für hasOwnProperty hier. Auch getOwnProperty wird versteckte Eigenschaften zurückgeben, da die Länge in Array usw. ist.

28voto

DanMan Punkte 10939

Um nicht mit dem Prototyp oder anderem Code zu hantieren, können Sie Ihr eigenes Objekt erstellen und erweitern:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

Wenn Sie immer die Add-Methode verwenden, wird die Längeneigenschaft korrekt sein. Wenn Sie befürchten, dass Sie oder andere die Verwendung vergessen, könnten Sie die Eigenschaft Zähler, die die anderen gepostet haben, auch der Längenmethode hinzufügen.

Natürlich können Sie die Methoden jederzeit überschreiben. Aber selbst wenn Sie das tun, würde Ihr Code wahrscheinlich merklich versagen, was die Fehlersuche erleichtert ;)

0 Stimmen

Ich denke, dies ist die beste Lösung, da es keine Schleife mit 'for', die kostspielig sein könnte, wenn das Array groß ist, erfordert

27voto

solanki... Punkte 4372

Wir können die Länge von Object mit Hilfe von finden:

const myObject = {};
console.log(Object.values(myObject).length);

0 Stimmen

Theoretisch wäre diese Methode bei langen Werten langsamer als die Methode "keys", da sie direkt auf die Werte zugreift und sie dann zählt.

23voto

doekman Punkte 18062

Und vergessen Sie nicht zu prüfen, ob die Immobilie nicht in der Prototypenkette enthalten ist:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

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