98 votes

Nombre d'éléments dans un objet javascript

Existe-t-il un moyen d'obtenir (de quelque part) le nombre d'éléments dans un objet Javascript ? (c'est-à-dire une complexité constante en temps).

Je ne trouve pas de propriété ou de méthode permettant de récupérer cette information. Jusqu'à présent, je n'ai pensé qu'à faire une itération à travers toute la collection, mais c'est un temps linéaire.
C'est étrange qu'il n'y ait pas d'accès direct à la taille de l'objet, vous ne trouvez pas ?

EDITAR:
Je parle de la Object (et non les objets en général) :

var obj = new Object ;

148voto

Christoph Points 64389

Bien que les implémentations JS puissent garder la trace d'une telle valeur en interne, il n'y a pas de moyen standard de l'obtenir.

Dans le passé, la variante Javascript de Mozilla exposait le fichier hors normes __count__ mais il a été supprimé avec la version 1.8.5.

Pour les scripts multi-navigateurs, vous êtes obligé d'itérer explicitement sur les propriétés et de vérifier hasOwnProperty() :

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

Dans le cas des implémentations compatibles avec ECMAScript 5, cela peut également être écrit comme suit (Kudos to Avi Flax )

function countProperties(obj) {
    return Object.keys(obj).length;
}

Gardez à l'esprit que les propriétés qui ne sont pas énumérables (par exemple, les propriétés d'un tableau) vous échapperont également. length ).

Si vous utilisez un framework comme jQuery, Prototype, Mootools, $quelque soit le dernier cri, vérifiez s'il est fourni avec sa propre API de collections, qui pourrait être une meilleure solution à votre problème que l'utilisation d'objets JS natifs.

87voto

ZelkiN Points 131

Pour faire cela dans n'importe quel environnement compatible avec ES5

Object.keys(obj).length

(Support des navigateurs de aquí )
(Doc sur Object.keys aquí La méthode que vous pouvez ajouter aux navigateurs non ECMA5 est incluse.)

5voto

kennebec Points 33886
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

2voto

Peter Bailey Points 62125

A priori, il n'y a aucun moyen de le faire de manière fiable, à moins de passer à un tableau. Ce qui, honnêtement, n'a pas semble étrange - il me semble assez évident que les tableaux sont dénombrables, et que les objets ne le sont pas.

Le résultat le plus proche que vous obtiendrez sera probablement quelque chose comme ça.

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Mais cela crée des problèmes, ou du moins des questions. Toutes les propriétés créées par l'utilisateur sont comptées, y compris la fonction _length elle-même ! Et alors que dans cet exemple simple vous pourriez l'éviter en utilisant simplement une fonction normale, cela ne signifie pas que vous pouvez empêcher d'autres scripts de faire cela. alors que faites-vous ? Ignorer les propriétés des fonctions ?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

Au final, je pense que vous devriez probablement abandonner l'idée de rendre vos objets dénombrables et trouver un autre moyen de faire ce que vous faites.

1voto

annakata Points 42676

Le concept de nombre/longueur/dimensionnalité n'a pas vraiment de sens pour un objet, et en avoir besoin suggère que vous voulez vraiment un tableau.

Edit : On m'a fait remarquer que vous voulez un O(1) pour cela. Pour autant que je sache, il n'existe pas de tel moyen, j'en ai bien peur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X