Itérer sur chaque propriété d'un objet en javascript en utilisant Prototype?


89

Existe-t-il un moyen d'itérer sur chaque propriété d'un objet à l'aide du framework JavaScript Prototype?

Voici la situation: j'obtiens une réponse AJAX dans JSON qui ressemble à ceci:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Si j'évalue cette réponse json dans une variable response, je veux pouvoir parcourir chaque propriété de l' response.barobjobjet pour voir quels index sont vrais et lesquels sont faux.

Le prototype a les deux Object.keys()et Object.values()semble étrangement ne pas avoir une Object.each()fonction simple ! Je pourrais prendre les résultats d'Object.keys () et Object.values ​​() et faire des références croisées avec l'autre en parcourant l'un, mais c'est un tel hack que je suis sûr qu'il y a une bonne façon de le faire!

Réponses:


42

Vous devez d'abord convertir votre objet littéral en un prototype de hachage :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Parfait! Ceci est exactement ce que je cherchais.
OverloadUT

57
Malheureusement, depuis qu'une question similaire a été fermée, celle qui voulait juste itérer sur un simple objet javascript sans Prototype, je dois maintenant traiter cette réponse comme si c'était la même chose que la question qui a été fermée en raison de "duplication". Donc, horrible exemple car il oblige l'utilisateur à charger Prototype. L'utilisateur n'a rien dit à propos de Prototype, donc les forcer à charger une bibliothèque indésirable n'est pas utile. (rappelez-vous, en traitant cela comme s'il s'agissait vraiment d'un double). Si l'autre question n'avait pas été close en raison de la fausse allégation de duplication, je n'aurais pas à voter contre la réponse.

2
Le demandeur n'a-t-il pas mentionné qu'il voulait un prototype (ou la question a-t-elle été modifiée?)? Quoi qu'il en soit, c'est tout bon
emurano

Pas besoin de charger une bibliothèque externe
Healkiss

553

Il n'y a pas besoin de Prototype ici: JavaScript a des for..inboucles. Si vous n'êtes pas sûr que personne n'a dérangé Object.prototype, vérifiez hasOwnProperty()également, c.-à-d.

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Merci pour la réponse proprement dite sans nous obliger à charger une bibliothèque indésirable.

8
ce n'est pas la bonne réponse. les questions indiquent que le prototype doit être utilisé! liberté de choix - haha ​​...
Sven Larson

1
Le titre original de cette question mentionnait Prototype, que j'ai rajouté pour plus de clarté. Cette question, comme en témoigne la toute première ligne du corps, portait spécifiquement sur un environnement dans lequel Prototype est utilisé.
SurchargeUT

1
Plus vous écrivez du Javascript, plus vous détesterez écrire des forboucles :)
Triptyque

13
Malheureusement, c'est la question qui apparaît comme n ° 1 si vous recherchez quelque chose comme "comment parcourir chaque propriété d'objet javascript", donc beaucoup de gens qui viennent ici recherchent probablement la réponse à cette question. La question qu'ils veulent est celle-ci: stackoverflow.com/questions/921789/… , qui n'a vraiment rien à voir avec les littéraux d'objet.
Baxissimo le

0

Vous devez parcourir les clés et obtenir les valeurs en utilisant des crochets.

Voir: Comment énumérer les propriétés d'un objet javascript?

EDIT: De toute évidence, cela fait de la question un double.


Cette méthode est fortement déconseillée dans la documentation du prototype
OverloadUT

1
De plus, je ne pense pas que ce soit un doublon parce que je cherchais une solution Prototype native qui est ce que j'ai obtenu. L'autre question est décente pour quelqu'un qui ne veut pas qu'il utilise un framework, mais cette solution est beaucoup plus sûre si vous utilisez Prototype.
OverloadUT

1
@OverloadUT: vous n'avez pas lu assez attentivement: il est déconseillé de parcourir les propriétés des tableaux, pas des objets simples
Christoph
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.