web-dev-qa-db-fra.com

Comment obtenir la longueur d'un objet

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.

256
Larry Cinnabar

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.

521
David Tang

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/

64
Šime Vidas

Peut être fait facilement avec $.map() :

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

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
43
Philip Schweiger

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

19
tibalt

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;
}
9
Larry Cinnabar

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;
    });
  };
 }
6
Robert Brisita

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;
4
Andrew Plank

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)

4

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);
2
Jpsy

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();
1
doublejosh

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
0
Yaki Klein

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 ] ]
0
sulthan thoufeeq