Pourquoi ma boucle for-each n'itère-t-elle pas sur mon objet tableau associatif JavaScript?
// 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(array[i]);
}
EDIT: jQuery each()
pourrait être utile: https://api.jquery.com/jQuery.each/
La propriété .length
suit uniquement les propriétés avec des index numériques (clés). Vous utilisez des chaînes pour les clés.
Tu peux le faire:
var arr_jq_TabContents = {}; // no need for an array
arr_jq_TabContents["Main"] = jq_TabContents_Main;
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, c'est une bonne idée dans les boucles comme celle-ci de s'assurer qu'aucune des propriétés n'est un résultat inattendu 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 de noter maintenant que la fonction Object.keys()
est disponible sur les navigateurs modernes et dans Node, etc. Cette fonction renvoie les clés "propres" d'un objet, sous forme de tableau:
Object.keys(arr_jq_TabContents).forEach(function(key, index) {
console.log(this[key]);
}, arr_jq_TabContents);
La fonction de rappel transmise à .forEach()
est appelée avec chaque clé et son index dans le tableau renvoyé par Object.keys()
. Il a également passé le tableau à travers lequel la fonction itère, mais ce tableau ne nous est pas vraiment utile; nous avons besoin de l’objet original . Vous pouvez y accéder directement par nom, mais (à mon avis), il est un peu plus agréable de le passer explicitement, ce qui se fait en passant un deuxième argument à .forEach()
- l'objet d'origine - qui sera lié en tant que this
à l'intérieur du rappel. (Je viens de voir que cela a été noté dans un commentaire ci-dessous.)
C'est une approche très simple. L'avantage est que vous pouvez également obtenir des clés:
for (var key in array) {
var value = array[key];
console.log(key, value);
}
Pour ES6:
array.forEach(value => {
console.log(value)
})
Pour ES6: (Si vous voulez valeur, index et le tableau lui-même)
array.forEach((value, index, self) => {
console.log(value, index, self)
})
Il existe déjà quelques exemples simples, mais d'après votre formulation, vous constatez que vous venez probablement de PHP et que vous vous attendez à ce que JavaScript fonctionne de la même manière - ce n'est pas le cas. Un PHP array
est très différent d'un JavaScript Array
.
En PHP, un tableau associatif peut faire presque tout ce qu'un tableau indexé numériquement (les fonctions array_*
fonctionnent, vous pouvez le count()
, etc.). Vous créez simplement un tableau et commencez à affecter des index de chaîne au lieu de numériques.
En JavaScript, tout est un objet (à l'exception des primitives: chaîne, numérique, booléen), et les tableaux sont une implémentation particulière qui vous permet de disposer d'index numériques. Tout élément poussé dans un tableau affectera sa length
et pourra être itéré à l'aide des méthodes Array (map
, forEach
, reduce
, filter
, find
, etc.) Cependant, comme tout est un objet, vous êtes toujours libre d'assigner des propriétés, parce que c'est quelque chose que vous faites à n'importe quel objet. La notation entre crochets est simplement un autre moyen d’accéder à une propriété, donc dans votre cas:
array['Main'] = 'Main Page';
est en fait équivalent à:
array.Main = 'Main Page';
D'après votre description, je suppose que vous voulez un "tableau associatif", mais pour JavaScript, il s'agit d'un cas simple d'utilisation d'un objet en tant que hashmap. Je sais aussi que c'est un exemple, mais évitez les noms non explicites qui décrivent uniquement le type de variable (par exemple, array
) et le nom en fonction de ce qu'elle devrait contenir (par exemple, pages
). Les objets simples n'ont pas beaucoup de bonnes manières directes d'itérer, aussi nous transformons souvent d'abord en tableaux en utilisant les méthodes Object
(Object.keys
dans ce cas - il y a aussi entries
et values
actuellement ajoutés à certains navigateurs) que nous pouvons boucler .
// assigning values to corresponding keys
const pages = {
Main: 'Main page',
Guide: 'Guide page',
Articles: 'Articles page',
Forum: 'Forum board',
};
Object.keys(pages).forEach((page) => console.log(page));
arr_jq_TabContents[key]
voit le tableau comme une forme d'index 0.
Voici un moyen simple d'utiliser un tableau associatif en tant que type d'objet générique:
Object.prototype.forEach = function(cb){
if(this instanceof Array) return this.forEach(cb);
let self = this;
Object.getOwnPropertyNames(this).forEach(
(k)=>{ cb.call(self, self[k], k); }
);
};
Object({a:1,b:2,c:3}).forEach((value, key)=>{
console.log(`key/value pair: ${key}/${value}`);
});
var obj = {
no : ["no",32],
nt : ["no",32],
nf : ["no",32,90]
};
count = -1; // which must be static value
for(i in obj){
count++;
if(obj.hasOwnProperty(i){
console.log(obj[i][count])
};
};
dans ce code, j’utilisais la méthode des parenthèses pour les valeurs d’appel dans array car elle contenait un tableau, mais brièvement l’idée selon laquelle une variable i possède une clé de propriété et avec une boucle appelée les deux valeurs d’un tableau associé
méthode parfaite, si cela vous intéresse, appuyez comme
Si le fichier node.js ou le navigateur est pris en charge Object.entries()
, il peut être utilisé à la place de Object.keys()
( https://stackoverflow.com/a/18804596/225291 ).
const h = {
a: 1
b: 2
};
Object.entries(h).forEach(([key, value]) => console.log(value));
// => 1
// => 2
dans cet exemple, forEach
utilise Affectation de destruction d'un tableau.