11524 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

je déclare un certain nombre de tableau qui ont des noms et des contenus similaires


   // var lundiPack=[], mardiPack=[] ..........  etc ....
  lundiPack[1] = [];
  lundiPack[2] = [];
  lundiPack[3] = [];

  mardiPack[1] = [];
  mardiPack[2] = [];
  mardiPack[3] = [];

  mercrediPack[1] = [];
  mercrediPack[2] = [];
  mercrediPack[3] = [];

  jeudiPack[1] = [];
  jeudiPack[2] = [];
  jeudiPack[3] = [];

  vendrediPack[1] = [];
  vendrediPack[2] = [];
  vendrediPack[3] = [];

  samediPack[1] = [];
  samediPack[2] = [];
  samediPack[3] = [];

cela fait beaucoup de code répétitif et j'aimerais alimenter tout ces tableaux avec une boucle du style

    ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"].forEach(element => {
       xxxxx[1] = [];
       xxxxx[2] = [];
       xxxxx[3] = [];
    });

et bien sur à la place de xxxxx je voudrais utiliser l'élément courant de la boucle pour générer le nom de variable style "elementPack".

On peut faire ça avec Php en ajoutant une 2ème $ ($$variable) mais je sais pas si c'est possible à faire en javascript...
Modifié par lionel_css3 (12 Sep 2021 - 11:09)
Modérateur
Et l'eau Lionel,

Malheureusement ça n'existe pas. À ma connaissance, il n'y a que php qui utilise ce genre de syntaxe. Pour moi, quand tu utilises ce genre de syntaxe en php, ça veut dire que le truc est tordu. Dans ce cas-là, mieux vaut utiliser le système de destructuration (merci Python Smiley cligne )....

en php (<=7.0):

list($a, $b, $c) = ['a', 'b',  'c'];

maintenant (>=7.1):

[$a, $b, $c] = ['a', 'b', 'c'];


en JS (de mémoire es7) :

let {a, b, c} = ['a', 'b', 'c']


Pourquoi n'utilises-tu pas un objet littéral ?


packDays = {
    'monday' : [],
    'tuesday' : [],
    'wednesday' : [],
    'thirsday' : [],
    'friday' : [],
    'saturday' : [],
    'sunday' : [],
}

Modifié par niuxe (12 Sep 2021 - 12:01)
peut-être avec window[commun+reste]

exemple :
	pfix='abc';
	for ( i=0;i<5;i++ )
	{	window[pfix+(i.toString())]=i;
		alert(window[pfix+(i.toString())]);
	}


à adapter à votre problème ?
@+
peut-être plus proche / clair ?

	pfix='abc';
	sufx=['a','b','c'];
	for ( i=0;i<sufx.length;i++ ) {
		window[pfix+sufx[i]]=i;
	}
	for ( a=0;a<sufx.length;a++ ) {
		alert(window[pfix+sufx[a]]);
	}

Modifié par bul (12 Sep 2021 - 14:17)
Modérateur
bul a écrit :
peut-être plus proche / clair ?

	pfix='abc';
	sufx=['a','b','c'];
	for ( i=0;i&lt;sufx.length;i++ ) {
		window[pfix+sufx[i]]=i;
	}
	for ( a=0;a&lt;sufx.length;a++ ) {
		alert(window[pfix+sufx[a]]);
	}


Bien vu. Mais c'est une variable provenant de window.... Donc source d'ennuis ! En d'autres termes, les variables globales sont à éviter
Modifié par niuxe (12 Sep 2021 - 15:15)
Modérateur
@Lionel : Le souci est que tu donnes peu d'élément. Donc je ne peux que te donner plus générique. À priori, l'idée de l'objet static me semble bonne. Smiley cligne
niuxe a écrit :
@Lionel : Le souci est que tu donnes peu d'élément. Donc je ne peux que te donner plus générique. À priori, l'idée de l'objet static me semble bonne. Smiley cligne


en fait je souhaitais savoir si il existe une réponse standard à ce genre de question ,c'est pour ça que mon exemple ne comptait pas en fait...
Modérateur
lionel_css3 a écrit :


en fait je souhaitais savoir si il existe une réponse standard à ce genre de question ,c'est pour ça que mon exemple ne comptait pas en fait...


Depuis que je code (ça fait un bail), je n'ai jamais utilisé la var de var en php ($$var). Tu peux faire sans ! En JS, tu peux apparemment. Mais tu globalises la variable. La chose à éviter...
Modifié par niuxe (13 Sep 2021 - 06:28)
J'aimerais comprendre pourquoi les variables globales sont "la chose à éviter".
Toutes les fonction sont des variables globales, pourquoi pas certaines variables?
Mes conventions sont de nommer les variables globales en majuscules, ça fait plus de 20 ans que je fais ça, je n'ai jamais eu de bug dû à l'utilisation des variables globales.
Le seul problème potentiel que j'imagine serait d'avoir le même nom de variable dans deux fichiers .js différents, mais c'est la même chose avec les noms de fonctions.
Modérateur
Une collision.... Imagine une page web avec du JS partout (20 à 30 scripts).Certains JS viennent de l'extérieur... Fais un tour sur https://www.leparisien.fr/. Regarde en console (onglet réseau) le nombre de JS appelés (73).

Ce n'est pas pour rien que let ou les closures existent. Bien que je sois fan des closures, je contrains toutes mes var. Ainsi, je suis sûr que mon script et les autres scripts sont intègrent.
Modifié par niuxe (13 Sep 2021 - 18:15)
Smiley hum Je ne comprends pas bien ce que tu cherches à faire Smiley ohwell
Cela ne serait pas tout bêtement un tableau qu'il te faudrait ?

Si tu as plein de fois le même type d'élément avec plus ou moins la même structure, généralement c'est qu'il faut un tableau qui les regroupe pour simplifier le code (et dans ton exemple vu que c'est déjà des tableaux c'est une matrice mais cela reste le même principe (genre semaine[7][3] ))
Modérateur
Mathieuu a écrit :
Smiley hum Je ne comprends pas bien ce que tu cherches à faire Smiley ohwell
Cela ne serait pas tout bêtement un tableau qu'il te faudrait ?

Si tu as plein de fois le même type d'élément avec plus ou moins la même structure, généralement c'est qu'il faut un tableau qui les regroupe pour simplifier le code (et dans ton exemple vu que c'est déjà des tableaux c'est une matrice mais cela reste le même principe (genre semaine[7][3] ))


C'est ce que j'ai expliqué avec un objet litteral.
bul a écrit :
peut-être plus proche / clair ?

	pfix='abc';
	sufx=['a','b','c'];
	for ( i=0;i&lt;sufx.length;i++ ) {
		window[pfix+sufx[i]]=i;
	}
	for ( a=0;a&lt;sufx.length;a++ ) {
		alert(window[pfix+sufx[a]]);
	}


ceci affiche successivement 0, 1 et 2 dans mon navigateur... c'est quoi le but?
Modérateur
regarde les console log ==> ta question


let days = [
    'lundi',
    'mardi',
    'mercredi',
    'jeudi',
    'vendredi',
    'samedi',
    'dimanche',
];
for(let i = 0; i < days.length; i++){
    let daysPack = [[], [], []];
    window[ days[i] ] = daysPack
}

console.log(lundi);
console.log(mardi);
Hello,

2 ans après je rebondis sur ma question, j'ai encore ce genre de problème.

imaginons que j'ai un tableau Javascript de taille variable (myArray)
je veux créer autant de variables indicées que d'éléments du tableau:
maVariable0
maVariable1
maVariable2
maVariable3
....
maVariablen

Est ce que je peux construire cette variable dynamiquement avec l'index parcouru dans une boule forEach comme dans l'exemple ci-dessous?

Je n'arrive pas à créer la syntaxe correcte...


        
       myArray.forEach((entry,index) => {

          // ça ça marche pas
          let `maVariable${index}` = entry.maPropriete;

        });