web-dev-qa-db-fra.com

Comment compter les attributs d'un objet JavaScript?

Supposons que j'ai l'objet suivant en JavaScript:

var object = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}; 

Comment savoir combien de valeurs existent dans l'objet?

157
Eugeniu Torica

Il n'y a pas de réponse facile, car Object - d'où provient chaque objet de JavaScript - inclut automatiquement de nombreux attributs et l'ensemble exact d'attributs que vous obtenez dépend de l'interpréteur spécifique et du code exécuté avant le vôtre. Donc, vous devez en quelque sorte séparer ceux que vous avez définis de ceux que vous avez obtenus "gratuitement".

Voici un moyen:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"};
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted

var count = 0;
for (var k in foo) {
    if (foo.hasOwnProperty(k)) {
       ++count;
    }
}
alert("Found " + count + " properties specific to foo");

La deuxième ligne montre comment un autre code peut ajouter des propriétés à tous les dérivés Object. Si vous supprimez la coche hasOwnProperty() à l'intérieur de la boucle, le nombre de propriétés atteindra au moins 4. Sur une page avec un code JavaScript autre que ce code, il pourrait être supérieur à 4, si cet autre code modifie également le code Object prototype.

103
Warren Young

Vous pouvez le faire en utilisant ce code simple:

Object.keys(myObject).length
489
deadrunk

Utilisez la bibliothèque nderscore , très utile: _.keys(obj).length.

49
jo_asakura

Vous pouvez parcourir l'objet pour obtenir les clés ou les valeurs:

function numKeys(obj)
{
    var count = 0;
    for(var prop in obj)
    {
        count++;
    }
    return count;
}

Cela ressemble à une "faute d’orthographe", mais je tiens simplement à souligner que votre exemple est une syntaxe non valide.

var object = {"key1":"value1","key2":"value2","key3":"value3"};
12
nexus says
 var miobj = [
  {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]},
  {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]}
 ];
 alert(miobj.length) //=== 2

mais

 alert(miobj[0].length) //=== undefined

cette fonction est très bonne

Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

alert(miobj.count()) // === 2
alert(miobj[0].count()) // === 4
12
pimus

Cette fonction utilise la propriété __count__ de Mozilla si elle est disponible, car elle est plus rapide que d’itérer sur chaque propriété.

function countProperties(obj) {
  var count = "__count__",
  hasOwnProp = Object.prototype.hasOwnProperty;

  if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) {
    return obj[count];
  }
  count = 0;
  for (var prop in obj) {
    if (hasOwnProp.call(obj, prop)) {
      count++;
    }
  }
  return count;
};

countProperties({
  "1": 2,
  "3": 4,
  "5": 6
}) === 3;
5
Eli Grey

EDIT: cela entraînera des erreurs avec jQuery, ainsi que d'autres inconvénients. VOUS NE DEVEZ PAS L'UTILISER.: (Peut-être que l'on pourrait ajouter une méthode privée à la place d'une fonction de propriété publique, ce serait OK, mais n’avez pas le temps maintenant). Communauté wikied

ne pas utiliser:

Même si l'objet javascript n'a pas la fonction count par défaut, les classes sont facilement extensibles, et on peut l'ajouter soi-même:

Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

Pour qu'après cela on puisse exécuter

var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'};
console.log(object.count()); // 3

En conclusion, si vous souhaitez compter la fonctionnalité de décompte dans les objets, vous devez copier le code du bloc de code 1 et le coller au début du temps d'exécution (avant d'appeler le décompte).

Laissez-moi savoir si cela fonctionne pour vous!

Cordialement, Pedro

3
droope

Pour ceux qui liront cette question/réponse, voici une implémentation JavaScript de la collection de dictionnaires très similaire à celle de .NET: JavaScript Dictionary

1
Michael H.