2289 votes

Itération dans les propriétés de l'objet

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

Comment la variable propt représentent les propriétés de l'objet ? Ce n'est pas une méthode ou une propriété intégrée. Pourquoi cela apparaît-il avec chaque propriété de l'objet ?

14 votes

if (typeof(obj[propt]) === 'object') { /* Do it again */ }

13 votes

Je suis vraiment désolé pour cette question. Je sais ce qu'est une boucle, je n'arrivais pas à me faire à l'idée de "boucler à travers les propriétés d'un objet", ce qui, je pense, est clair maintenant. Aussi, ils m'ont recommandé "JavaScript Step by Step 2nd Edition - Steve Suehring à l'école.

273 votes

C'est une bonne question pour les débutants. J'ajouterais que j'ai 15 ans d'expérience professionnelle avec d'autres langages et que j'avais besoin de cette réponse. J'ajouterais 2000 si je pouvais.

2558voto

Dominik Points 3576

L'itération sur les propriétés nécessite cet élément supplémentaire hasOwnProperty vérifier :

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

C'est nécessaire parce que le prototype d'un objet contient des propriétés supplémentaires pour l'objet qui font techniquement partie de l'objet. Ces propriétés supplémentaires sont héritées de la classe de l'objet de base, mais sont toujours des propriétés de la classe obj .

hasOwnProperty vérifie simplement s'il s'agit d'une propriété spécifique à cette classe, et non d'une propriété héritée de la classe de base.


Il est également possible d'appeler hasOwnProperty à travers l'objet lui-même :

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

Mais cela échouera si l'objet possède un champ sans rapport avec le même nom :

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

C'est pourquoi il est plus sûr d'appeler par le biais de Object.prototype à la place :

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

24 votes

@B T Selon le Documentation Mozilla : "Si vous souhaitez uniquement prendre en compte les propriétés attachées à l'objet lui-même, et non ses prototypes, utilisez getOwnPropertyNames. ou effectuer une vérification de hasOwnProperty (propertyIsEnumerable peut également être utilisé)."

3 votes

Quel est exactement l'intérêt d'appeler object.hasOwnProperty() ? Est-ce que le fait que property a une valeur quelconque qui implique que son dans object ?

7 votes

Parce que, Alex S, le prototype d'un objet contient des propriétés supplémentaires pour l'objet qui font techniquement partie de l'objet. Elles sont héritées de la classe d'objets de base, mais elles restent des propriétés. hasOwnProperty vérifie simplement s'il s'agit d'une propriété spécifique à cette classe, et non d'une propriété héritée de la classe de base. Une bonne explication : brianflove.com/2013/09/05/javascripts-hasownproperty-method

1287voto

Danny R Points 1007

À partir de JavaScript 1.8.5, vous pouvez utiliser Object.keys(obj) pour obtenir un tableau de propriétés définies sur l'objet lui-même (celles qui renvoient vrai pour la fonction obj.hasOwnProperty(key) ).

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

C'est mieux (et plus lisible) que d'utiliser une boucle for-in.

Il est supporté par ces navigateurs :

  • Firefox (Gecko) : 4 (2.0)
  • Chrome : 5
  • Internet Explorer : 9

Voir le Mozilla Developer Network Objet.keys() de référence pour de plus amples informations.

8 votes

Ce principe est désormais plus largement soutenu : developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/

3 votes

Et si vous avez besoin d'un support pour les anciens navigateurs, vous pouvez utiliser ceci polyfill

27 votes

Dans les environnements qui prennent en charge cette construction linguistique, cette méthode permet d'appeler Array.foreach : Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });

226voto

Marc B Points 195501

C'est le for...in statement ( MDN , Spécification ECMAScript ).

Vous pouvez le lire comme " POUR chaque propriété DANS le site obj affectez chaque propriété à l'objet PROPT variable à son tour".

1 votes

Merci beaucoup, je comprends maintenant. Je me tapais la tête, en parcourant les livres et Google.

21 votes

D'accord avec @RightSaidFred, la in et l'opérateur for ne sont pas du tout impliquées, la for-in déclaration représente une production grammaticale à part entière : for ( LeftHandSideExpression in Expression ) , for ( var VariableDeclarationNoIn in Expression )

2 votes

Bizarre que cette réponse ait autant de votes positifs, d'autant plus que ces commentaires populaires semblent la contredire.

44voto

Matt Ball Points 165937

C'est juste un for...in boucle. Consultez la documentation à Mozilla .

0 votes

Le lien est cassé :(.

1 votes

@Burak merci de me le faire savoir - corrigé. À l'avenir, n'hésitez pas à suggérer une modification :)

13voto

Rose Perrone Points 14478
for (property in object) {
  ...
}

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