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.

3231voto

Aktualisierte Antwort

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

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

Dabei muss kein bestehender Prototyp geändert werden, da Object.keys() ist jetzt eingebaut.

bearbeiten : Objekte 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.

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

Object.keys o Object.getOwnPropertyNames funktioniert nicht für symbolische Eigenschaften. Um sie zurückzugeben, müssen Sie 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

Ältere Antwort

Die solideste Antwort (d.h. die die Absicht dessen, was Sie zu tun versuchen, erfasst und gleichzeitig 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
const myObj = {}
var size = Object.size(myObj);

In JavaScript gibt es eine Art Konvention, dass man fügen Sie keine Dinge zu Object.prototype hinzu weil es Aufzählungen in verschiedenen Bibliotheken unterbrechen kann. Das Hinzufügen von Methoden zu Object ist jedoch normalerweise sicher.


68 Stimmen

@Tres - Ihr Code kann beschädigt werden, wenn jemand kommt und die Eigenschaft "Größe" überschreibt, ohne zu wissen, dass Sie sie bereits irgendwo im Code deklariert haben; es lohnt sich also immer zu überprüfen, ob sie bereits definiert ist.

19 Stimmen

@vsync Sie haben völlig recht. Man sollte immer notwendige Sanity Checks implementieren :)

1 Stimmen

Ich habe diese Antwort als jQuery-Plugin verpackt, für diejenigen, die sich nicht gerne mit Object : stackoverflow.com/a/11346637/11236

2011voto

aeosynth Punkte 20280

Wenn Sie wissen, dass Sie sich keine Sorgen machen müssen über hasOwnProperty prüft, können Sie die Object.keys() Methode auf diese Weise:

Object.keys(myArray).length

7 Stimmen

if (typeof Object.keys != 'function') { Object.keys = function(obj) { var ret = []; for (var x in obj) { if (obj.hasOwnProperty(x)) { ret[ret.length] = x; } } return ret; } }

25 Stimmen

Warum nicht? Soweit ich weiß, ist es ein Standard: developer.mozilla.org/de/JavaScript/Reference/Global_Objects/

109 Stimmen

Es ist keine universelle implementiert Methode, aber Sie können überprüfen, welcher Browser sie unterstützt mit diese Tabelle .

310voto

ripper234 Punkte 211096

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

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

Falls nicht und Sie aus welchen Gründen auch immer nicht mit den Objekteigenschaften herumspielen wollen und bereits jQuery verwenden, ist ein Plugin ebenso 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;
};

8 Stimmen

_.size() war die perfekte Lösung für meine Meteor Projekt, das underscore.js-Unterstützung bietet.

4 Stimmen

Ich verwende Unterstriche, und dieser Beitrag hat mich gerade daran erinnert, dass ich sie in diesem Projekt nicht ausreichend verwende. Wenn Sie mit Objekten arbeiten, sollten Sie underscore.js zur Verfügung haben.

3 Stimmen

Underscore > (alle -['lo-dash'])

68voto

Joon Punkte 8406

Hier ist die browserübergreifendste Lösung.

Dies ist besser als die akzeptierte Antwort, weil sie die nativen Object.keys verwendet, falls vorhanden. Daher ist sie für alle modernen Browser die schnellste.

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;

8 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/

44voto

saurabhgoyal795 Punkte 1147

Verwenden Sie dies einfach, um die length :

Object.keys(myObject).length

12 Stimmen

Erläutern Sie bitte, inwiefern sich Ihre Antwort unterscheidet von stackoverflow.com/a/6700/8632727

1 Stimmen

Gut, es ist immer besser, die Variablen so zu benennen, wie sie tatsächlich sind. Das macht Ihren Code für andere Entwickler besser lesbar.

6 Stimmen

Vor der Änderung "myArray" -> "myObject" war dies identisch mit der Antwort, die am zweithäufigsten hochgestimmt wurde.

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