222 votes

Javascript boucle foreach sur tableau associatif objet

Pourquoi mon pour pour-chaque boucle n'est pas à parcourir mon JavaScript tableau associatif objet?

// defining an array
var array = [];

// assigning values to corresponding keys
array["Main"] = "Main page";
array["Guide"] = "Guide page";
array["Articles"] = "Articles page";
array["Forum"] = "Forum board";

// expected: loop over every item,
// yet it logs only "last" assigned value - "Forum"
for (var i = 0; i < array.length; i++) {
    console.log(i);
}

EDIT: jQuery each() pourraient être utiles: https://api.jquery.com/jQuery.each/

368voto

Pointy Points 172438

L' .length bien que les propriétés des pistes avec des indices numériques (touches). Vous êtes à l'aide de cordes pour les clés.

Vous pouvez faire ceci:

var arr_jq_TabContents = {}; // no need for an array

arr_jq_TabContents["Main"] = jq_TabContents_Mian;
arr_jq_TabContents["Guide"] = jq_TabContents_Guide;
arr_jq_TabContents["Articles"] = jq_TabContents_Articles;
arr_jq_TabContents["Forum"] = jq_TabContents_Forum;

for (var key in arr_jq_TabContents) {
    console.log(arr_jq_TabContents[key]);
}

Pour être sûr, il est une bonne idée en boucle comme ça pour s'assurer qu'aucune de ces propriétés sont des résultats inattendus de l'héritage:

for (var key in arr_jq_TabContents) {
  if (arr_jq_TabContents.hasOwnProperty(key))
    console.log(arr_jq_TabContents[key]);
}

edit — c'est probablement une bonne idée maintenant de noter que l' Object.keys() fonction est disponible sur les navigateurs modernes et dans le Nœud etc. Cette fonction renvoie le "propre" clés d'un objet, comme un tableau:

Object.keys(arr_jq_TabContents).forEach(function(key, index) {
  console.log(this[key]);
}, arr_jq_TabContents);

La fonction de callback passé de .forEach() est appelée à chaque clé et la clé de l'index dans le tableau retourné par Object.keys(). Il est également passé à la matrice à travers laquelle la fonction est une itération, mais ce tableau n'est pas vraiment utile pour nous; nous avons besoin de l'original de l'objet. Qui peuvent être accessibles directement par son nom, mais (à mon avis) c'est un peu plus agréable pour passer explicitement, ce qui est fait en passant un second argument .forEach() — l'original de l'objet qui va être lié en tant que this à l'intérieur de la fonction de rappel. (Juste vu que cela a été relevé dans un commentaire ci-dessous.)

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