Pourquoi ma boucle for for-each n'itère 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/
javascript
arrays
foreach
Szymon Toda
la source
la source
associative arrays
dans JS: c'est soit un tableau simple, soit un objet. Rien n'empêche d'ajouter des propriétés non numériques àArray
, mais cela ne le fait pasassociative
- en particulier, lalength
propriété ne compte pas automatiquement ces propriétés.Réponses:
La
.length
propriété ne suit que les propriétés avec des index numériques (clés). Vous utilisez des chaînes pour les clés.Tu peux le faire:
Pour être sûr, c'est une bonne idée dans des boucles comme celle-ci pour s'assurer qu'aucune des propriétés n'est un résultat inattendu d'héritage:
edit - c'est probablement une bonne idée maintenant de noter que la
Object.keys()
fonction est disponible sur les navigateurs modernes et dans Node etc. Cette fonction renvoie les "propres" clés d'un objet, sous forme de tableau:La fonction de rappel passée à
.forEach()
est appelée avec chaque clé et l'index de la clé dans le tableau renvoyé parObject.keys()
. Il est é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 . On peut y accéder directement par nom, mais (à mon avis) c'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é commethis
dans le rappel. (Je viens de voir que cela a été noté dans un commentaire ci-dessous.)la source
var arr_jq_TabContents = {};
? Je veux dire {}[]
et{}
? Seuls les différents prototypes?Object.keys(arr_jq_TabContents).forEach( function(key) { ... } );
C'est une approche très simple. L'avantage est que vous pouvez également obtenir des clés:
Pour ES6:
Pour ES6: (Si vous voulez une valeur, un index et le tableau lui-même)
la source
var
dans des boucles suggérant une portée qui n'existe pas. À utiliservar
devant la boucle oulet
dans la boucle.for
boucle génère une portée limitée au corps de lafor
boucle. Mais en JavaScript, une variable déclarée parvar
est toujours une fonction globale même si vous l'écrivez dans unefor
boucle. Voir ici: davidwalsh.name/for-and-against-letvar
en Javascript crée des variables en mémoire même après la boucle.Il existe déjà des exemples simples, mais je remarque, d'après la formulation de votre question, que vous venez probablement d'un arrière-plan PHP, et 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 JavaScriptArray
.En PHP, un tableau associatif peut faire la plupart de ce qu'un tableau indexé numériquement peut (les
array_*
fonctions fonctionnent, vous pouvez lecount()
faire, etc.) Vous créez simplement un tableau et commencez à attribuer 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 certaine implémentation qui vous permet d'avoir des index numériques. Tout ce qui pousse à un tableau effectuera son
length
, et peut être itéré en utilisant des méthodes Array (map
,forEach
,reduce
,filter
,find
, etc.) Cependant, parce que tout est un objet, vous êtes toujours libre de simplement les propriétés Assigner, parce que quelque chose que vous faites pour n'importe quel objet. La notation entre crochets est simplement un autre moyen d'accéder à une propriété, donc dans votre cas:équivaut en fait à:
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 comme hashmap. Aussi, je sais que c'est un exemple, mais évitez les noms non significatifs qui décrivent uniquement le type de variable (par exemple
array
), et le nom en fonction de ce qu'il devrait contenir (par exemplepages
). Les objets simples n'ont pas beaucoup de bons moyens directs d'itérer, donc souvent nous nous transformerons ensuite en tableaux en utilisant d'abord desObject
méthodes (Object.keys
dans ce cas - il y en a aussientries
et envalues
cours d'ajout à certains navigateurs en ce moment) que nous pouvons boucler.la source
arr_jq_TabContents[key]
voit le tableau comme une forme d'index 0.la source
Voici un moyen simple d'utiliser un tableau associatif comme type d'objet générique:
la source
Si le node.js ou le navigateur est pris en charge
Object.entries()
, il peut être utilisé comme alternative à l'utilisationObject.keys()
( https://stackoverflow.com/a/18804596/225291 ).dans cet exemple,
forEach
utilise l' affectation de destruction d'un tableau.la source
Ceci est (essentiellement) incorrect dans la plupart des cas:
Cela crée une propriété non élémentaire sur le tableau avec le nom
Main
. Bien que les tableaux soient des objets, vous ne souhaitez normalement pas créer de propriétés non élémentaires sur eux.Si vous souhaitez indexer
array
par ces noms, vous utiliserez généralement unMap
objet ou un objet simple, pas un tableau.Avec un
Map
(ES2015 +), que j'appelleraimap
parce que je suis créatif:vous itérer ensuite à l'aide des itérateurs de ses
values
,keys
ouentries
méthodes, par exemple:En utilisant un objet simple, que j'appellerai de manière créative
obj
:vous auriez alors itérer son contenu en utilisant
Object.keys
,Object.values
ouObject.entries
, par exemple:la source
dans ce code, j'ai utilisé la méthode des crochets pour les valeurs d'appel dans le tableau car il contenait un tableau, mais brièvement l'idée qu'une variable i a une clé de propriété et avec une boucle appelée les deux valeurs du tableau associé
Méthode parfaite, si vous êtes intéressé, appuyez sur comme
la source
Tu peux le faire
la source