Existe-t-il une fonction intégrée pouvant renvoyer la longueur d'un objet?
Par exemple, j'ai a = { 'a':1,'b':2,'c':3 }
qui devrait renvoyer 3
. Si j'utilise a.length
, il retourne undefined
.
Ce pourrait être une simple fonction de boucle, mais j'aimerais savoir s'il existe une fonction intégrée?
Il existe une question connexe ( Longueur d'un objet JSON ) - dans la réponse choisie, l'utilisateur conseille de transformer l'objet en un tableau, ce qui n'est pas très pratique pour moi.
Pour les navigateurs supportant Object.keys () vous pouvez simplement faire:
Object.keys(a).length;
Sinon (notamment dans IE <9), vous pouvez parcourir l'objet vous-même avec une boucle for (x in y)
:
var count = 0;
var i;
for (i in a) {
if (a.hasOwnProperty(i)) {
count++;
}
}
La hasOwnProperty
est là pour vous assurer que vous ne comptez que les propriétés à partir du littéral d'objet et non les propriétés qu'il "hérite" de son prototype.
Cela devrait le faire:
Object.keys(a).length
Cependant, Object.keys
n'est pas pris en charge dans IE8 et ses versions antérieures, Opera et FF 3.6 et ses versions antérieures.
Démo en direct:http://jsfiddle.net/simevidas/nN84h/
Peut être fait facilement avec $.map()
:
var len = $.map(a, function(n, i) { return i; }).length;
Avez-vous examiné underscore.js ( http://underscorejs.org/docs/underscore.html )? C'est une bibliothèque d'utilitaires avec beaucoup de méthodes utiles. Il existe une méthode collection size
, ainsi qu'une méthode toArray, qui peut vous fournir ce dont vous avez besoin.
_.size({one : 1, two : 2, three : 3});
=> 3
En résumé, voici une fonction universelle (incluant le support ie8):
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
Dans jQuery, je l'ai conçu de la manière suivante:
len = function(obj) {
var L=0;
$.each(obj, function(i, elem) {
L++;
});
return L;
}
Donc, il n'est pas nécessaire de trouver et de remplacer la méthode Object.keys, une autre approche serait ce code au début de l'exécution du script:
if(!Object.keys)
{
Object.keys = function(obj)
{
return $.map(obj, function(v, k)
{
return k;
});
};
}
Voici une fonction jQuery de la réponse d'Innuendo, prête à l'emploi.
$.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;
}
}
});
Peut être appelé comme ça:
var cnt = $.keyCount({"foo" : "bar"}); //cnt = 1;
Une autre réponse:
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)
Pour ceux qui viennent ici pour trouver le nombre d'éléments de quelque chose qui est déjà un objet jQuery :
. longueur est ce que vous recherchez:
Exemple:
len = $('#divID').length;
alert(len);
Si vous voulez éviter de nouvelles dépendances, vous pouvez créer vos propres objets intelligents. Bien sûr, seulement si vous voulez faire plus que simplement obtenir sa taille.
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();
Vous pourriez avoir une propriété non définie dans l'objet . Si vous utilisez la méthode de Object.keys(data).length
, ces propriétés seront également comptées.
Vous voudrez peut-être les filtrer.
Object.keys(data).filter((v) => {return data[v] !== undefined}).length
Aussi peut être fait de cette façon:
Object.entries(obj).length
Par exemple:
let obj = { a: 1, b: 2, };
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]