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.
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".
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/
Kann leicht mit $.map()
gemacht werden:
var len = $.map(a, function(n, i) { return i; }).length;
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
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
In jQuery habe ich es so gemacht:
len = function(obj) {
var L=0;
$.each(obj, function(i, elem) {
L++;
});
return L;
}
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;
});
};
}
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;
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)
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);
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();
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
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 ] ]