11496 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Est-il possible d'attribuer un nom à une cellule de tableau de façon à modifier sa valeur sans devoir utiliser les indices de la cellule ?

Par exemple, si la cellule Tableau[7] doit contenir une certaine valeur, d'abord initialisée, puis modifiée dans le programme, j'aimerais pouvoir attribuer le libellé "nom_de_la_cellule_7" à cette cellule et pouvoir ensuite directement écrire
nom_de_la_cellule_7 = [la nouvelle valeur].

Pour l'instant, j'ai trouvé le procédé suivant :
Tableau[7] = new Array();
nom_de_la_cellule_7 = Tableau[7];
[...]
nom_de_la_cellule_7.push(valeur_initiale);
[...]
nom_de_la_cellule_7.pop();
nom_de_la_cellule_7.push(nouvelle_valeur);

La valeur se trouve alors dans la cellule Tableau[7][0] et non dans la cellule Tableau[7].

Y-a-t-il une possibilité plus directe et permettant d'avoir la valeur dans la cellule Tableau[7] et non dans la cellule Tableau[7][0] ?
Si non, ce n'est pas très gênant d'avoir la valeur dans la cellule Tableau[7][0] et d'écrire l'affectation de la valeur en deux lignes, la ligne pop et la ligne push.

Merci d'avance de votre aide.
Modifié par Beka (06 Nov 2018 - 23:43)
Modérateur
ça s'appelle les tableaux associatifs.... Dans ce cas là, il faut penser que tu n'as pas d'ordre précis sauf si tu fais une opération sur ce type de variable pour arriver à tes fins !


var monTableau = {
    'une clef' : 'une valeur',
    'une autre clef' : 'une autre valeur',
};

monTableau['et encore une clef'] = 'et encore une valeur';

console.log(monTableau['une clef']);

Modifié par niuxe (09 Nov 2018 - 17:22)
Merci, Niuxe, de ta réponse.

En l'occurrence, il s'agit de tableaux relativement sophistiqués dont la génération nécessite à elle seule un important travail de conception et de programmation.
Ce ne sont donc absolument pas des tableaux de mémorisation de valeurs étiquetées.

J'ai besoin de pouvoir attribuer un libellé aux différentes cellules pour ne pas avoir à me souvenir en permanence que telle valeur est contenue dans la cellule [5] de tel tableau et que telle autre est contenue dans la cellule [7][2] de tel autre.
(Surtout, si je me rends compte par la suite que je dois modifier la structure des tableaux.)

La solution d'affectation par pop et push que j'utilise me convient finalement bien, même si elle n'est pas aussi directe que la simple égalisation.
Modifié par Beka (10 Nov 2018 - 13:59)
Il y a cependant un point auquel il faut faire attention :

La fonction push convertit un nombre en une chaîne de caractères.
nom_de_la_cellule_7.push(5);

enregistre le caractère "5" et non le nombre 5.

Pour effectuer des opérations arithmétiques ou mathématiques sur une ou des valeurs numériques, il faut d'abord convertir la ou les valeurs concernées en nombre(s) puis enregistrer la valeur obtenue dans la cellule labellisée.
Exemple :
valeur_cellule_7 = parseInt(nom_de_la_cellule_7) + 3;
nom_de_la_cellule_7.pop();
nom_de_la_cellule_7.push(valeur_cellule_7);

Si on écrit directement
nom_de_la_cellule_7.pop();
nom_de_la_cellule_7.push(nom_de_la_cellule_7 + 3);

la valeur enregistrée est "53" et non 8.

L'affectation d'une valeur numérique en est certes un peu alourdie, mais je préfère personnellement manier des labels que des cellules indicées de tableau.