web-dev-qa-db-de.com

Wie bekomme ich die Objektlänge?

Gibt es eine eingebaute Funktion, die die Länge eines Objekts zurückgeben kann?

Zum Beispiel habe ich a = { 'a':1,'b':2,'c':3 }, der 3 zurückgeben sollte. Wenn ich a.length verwende, wird undefined zurückgegeben.

Es könnte sich um eine einfache Schleifenfunktion handeln, aber ich würde gerne wissen, ob es eine integrierte Funktion gibt.

Es gibt eine verwandte Frage ( Länge eines JSON-Objekts ) - in der ausgewählten Antwort empfiehlt der Benutzer, ein Objekt in ein Array umzuwandeln, was für meine Aufgabe nicht sehr angenehm ist.

256
Larry Cinnabar

Für Browser, die Object.keys () unterstützen, können Sie einfach Folgendes tun:

Object.keys(a).length;

Ansonsten (insbesondere in IE <9) können Sie das Objekt selbst mit einer for (x in y)-Schleife durchlaufen:

var count = 0;
var i;

for (i in a) {
    if (a.hasOwnProperty(i)) {
        count++;
    }
}

Die Variable hasOwnProperty sorgt dafür, dass Sie nur Eigenschaften aus dem Objektliteral zählen und keine Eigenschaften, die er von seinem Prototyp "erbt".

521
David Tang

Das sollte es tun:

Object.keys(a).length

Object.keys wird jedoch nicht von IE8 und darunter, Opera und FF 3.6 und darunter unterstützt.

Live Demo:http://jsfiddle.net/simevidas/nN84h/

64
Šime Vidas

Kann leicht mit $.map() gemacht werden:

var len = $.map(a, function(n, i) { return i; }).length;
58
Fazle Rabbi

Haben Sie sich underscore.js ( http://underscorejs.org/docs/underscore.html ) angesehen? Es ist eine Utility-Bibliothek mit vielen nützlichen Methoden. Es gibt eine Sammlungsmethode size sowie eine toArray-Methode, mit der Sie erhalten, was Sie benötigen.

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

Zusammenfassend ist hier eine universelle Funktion (einschließlich ie8-Unterstützung):

var objSize = function(obj) {
    var count = 0;
    
    if (typeof obj == "object") {
    
        if (Object.keys) {
            count = Object.keys(obj).length;
        } else if (window._) {
            count = _.keys(obj).length;
        } else if (window.$) {
            count = $.map(obj, function() { return 1; }).length;
        } else {
            for (var key in obj) if (obj.hasOwnProperty(key)) count++;
        }
        
    }
    
    return count;
};

document.write(objSize({ a: 1, b: 2, c: 3 }));
// 3

19
tibalt

In jQuery habe ich es so gemacht:

len = function(obj) {
    var L=0;
    $.each(obj, function(i, elem) {
        L++;
    });
    return L;
}
9
Larry Cinnabar

So muss man die Object.keys-Methode nicht finden und ersetzen, ein anderer Ansatz wäre dieser Code zu Beginn der Ausführung des Skripts:

if(!Object.keys)
{
  Object.keys = function(obj)
  {
    return $.map(obj, function(v, k)
    {
      return k;
    });
  };
 }
6
Robert Brisita

Hier ist eine jQuery-Funktion von Innuendos Antwort, die einsatzbereit ist.

$.extend({
    keyCount : function(o) {
        if(typeof o == "object") {
            var i, count = 0;
            for(i in o) {
                if(o.hasOwnProperty(i)) {
                    count++;
                }
            }
            return count;
        } else {
            return false;
        }
    }
});

Kann so aufgerufen werden:

var cnt = $.keyCount({"foo" : "bar"}); //cnt = 1;
4
Andrew Plank

Noch eine Antwort:

var j = '[{"uid":"1","name":"Bingo Boy", "profile_img":"funtimes.jpg"},{"uid":"2","name":"Johnny Apples", "profile_img":"badtime.jpg"}]';

obj = Object.keys(j).length;
console.log(obj)

4

Für diejenigen, die hierher kommen, um die Elementanzahl eines Objekts zu ermitteln, das bereits ein jQuery-Objekt ist :
. Länge ist was Sie suchen:

Beispiel:

len = $('#divID').length;
alert(len);
2
Jpsy

Wenn Sie neue Abhängigkeiten vermeiden möchten, können Sie Ihre eigenen intelligenten Objekte erstellen. Natürlich nur, wenn Sie mehr machen wollen, aber nur seine Größe bekommen.

MyNeatObj = function (obj) {
  var length = null;

  this.size = function () {
    if (length === null) {
      length = 0;
      for (var key in obj) length++;
    }
    return length;
  }
}

var thingy = new MyNeatObj(originalObj);
thingy.size();
1
doublejosh

Sie haben möglicherweise eine undefinierte Eigenschaft im Objekt ..__ Wenn Sie die Methode Object.keys(data).length verwenden, werden diese Eigenschaften ebenfalls gezählt. 

Vielleicht möchten Sie sie herausfiltern.

Object.keys(data).filter((v) => {return data[v] !== undefined}).length
0
Yaki Klein

Auch kann auf diese Weise gemacht werden:

Object.entries(obj).length

Zum Beispiel:

let obj = { a: 1, b: 2, };
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]
0