Frage Länge eines JavaScript-Objekts


Wenn ich ein JavaScript-Objekt habe, sag

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

Gibt es einen integrierten oder akzeptierten Best-Practice-Weg, um die Länge dieses Objekts zu erhalten?


1820
2017-08-07 19:42


Ursprung


Antworten:


Die robusteste Antwort (d. H., Die die Absicht dessen erfasst, was Sie zu tun versuchen, während sie die wenigsten Fehler verursacht) wäre:

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

// Get the size of an object
var size = Object.size(myArray);

Es gibt eine Art Konvention in JavaScript, die Sie kennen füge keine Dinge zu Object.prototype hinzu, weil es Aufzählungen in verschiedenen Bibliotheken aufbrechen kann. Das Hinzufügen von Methoden zu Object ist normalerweise jedoch sicher.


Hier ist ein Update ab 2016 und weite Verbreitung von ES5 und darüber hinaus.  Für IE9 + und alle anderen modernen ES5 + -fähigen Browser können Sie verwenden Object.keys() so wird der obige Code einfach:

var size = Object.keys(myObj).length;

Dies muss keinen vorhandenen Prototyp seit dem ändern Object.keys() ist jetzt eingebaut.

BearbeitenObjekte können symbolische Eigenschaften haben, die nicht über die Methode Object.key zurückgegeben werden können. Die Antwort wäre also unvollständig, ohne sie zu erwähnen.

Symboltyp wurde der Sprache hinzugefügt, um eindeutige Bezeichner für Objekteigenschaften zu erstellen. Hauptvorteil des Symboltyps ist die Vermeidung von Überschreibungen.

Object.keys oder Object.getOwnPropertyNames funktioniert nicht für symbolische Eigenschaften. Um sie zurückzugeben, müssen Sie verwenden Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

2011
2017-08-09 08:31



Wenn du weißt, dass du dir keine Sorgen machen musst hasOwnProperty checks, das geht ganz einfach:

Object.keys(myArray).length

1407
2018-04-03 01:44



Aktualisiert: Wenn Sie verwenden Underscore.js (empfohlen, es ist leicht!), dann können Sie einfach tun

_.size({one : 1, two : 2, three : 3});
=> 3

Wenn nicht, und aus irgendwelchen Gründen nicht mit Object-Eigenschaften herumhantieren wollen und bereits jQuery verwenden, ist ein Plugin gleichermaßen zugänglich:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

252
2017-07-05 14:39



Verwenden Sie etwas so einfaches wie:

Object.keys(obj).length

Es muss nicht schwierig sein und erfordert definitiv keine andere Funktion.


153
2017-10-27 03:46



Hier ist die browserübergreifende Lösung.

Dies ist besser als die akzeptierte Antwort, da es native Object.keys verwendet, falls vorhanden. Somit ist es das schnellste für alle modernen Browser.

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

43
2017-09-01 16:12



Ich bin kein JavaScript-Experte, aber es sieht so aus, als müssten Sie die Elemente durchlaufen und zählen, da das Objekt keine Längenmethode hat:

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

@ palmsey: In Fairness gegenüber dem OP bezieht sich die JavaScript-Dokumentation explizit auf die Verwendung von Variablen vom Typ Object auf diese Weise als "assoziative Arrays".


27
2017-08-07 19:52



Diese Methode ruft alle Objektnamen Ihres Objekts in einem Array ab, sodass Sie die Länge dieses Arrays ermitteln können, die der Länge Ihres Objektschlüssels entspricht.

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

25
2017-07-01 12:40



Um sich nicht mit dem Prototyp oder anderem Code zu verwirren, könnten 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 Methode add verwenden, ist die Eigenschaft length korrekt. Wenn Sie befürchten, dass Sie oder andere die Verwendung vergessen, können Sie den Eigenschaftszähler, den die anderen auch geschrieben haben, in die Längenmethode einfügen.

Natürlich könnten Sie die Methoden immer überschreiben. Aber selbst wenn Sie das tun, würde Ihr Code wahrscheinlich merklich ausfallen, was das Debugging erleichtert. ;)


19
2018-06-11 15:44



Hier ist, wie und vergessen Sie nicht zu überprüfen, dass die Eigenschaft nicht in der Prototyp-Kette ist:

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

14
2017-08-08 19:18