Accueil

Traduction

Tutoriel sur JS natif, Vue.js, jQuery.js & Node.js

Tutoriel JavaScript - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

JavaScript : les tableaux

Dans ce chapitre je vais traiter des tableaux dans JS au sens large c'est à dire non seulement les tableaux indicés (Array) mais aussi de nouvelles structures : les dictionnaires (Maps) et les ensembles (Sets).
Dans les trois cas il s'agit de variables contenant plusieurs valeurs élémentaires ou plusieurs couples clé:valeur.

Les objets "array" ou tableaux indicés

En JavaScript on désigne par "array" une liste indicée de valeurs. Un Array peut être à une ou plusieurs dimensions.

Dans un tableau indicé (ou liste indicée) chaque valeur est repérée par son rang (ou indice).
Attention le premier terme a l'indice zéro !
L'indice d'un élément découle de l'ordre de saisie ; il n'est jamais saisi !.

Tableau indicée : premier exemple

Nous allons nous familiariser avec la syntaxe en produisant des commandes dans la console du navigateur.
Consigne : saisir les lignes précédées de ">".
Les autres lignes sont les réponses de la console.

> premiers = [1,2,3,5,7,11]
(6) [1, 2, 3, 5, 7, 11]
> premiers.reverse()
(6) [11, 7, 5, 3, 2, 1]
> premiers.sort()
(6) [1, 11, 2, 3, 5, 7]
> premiers.shift()
1
> premiers.pop()
7
> premiers
(4) [11, 2, 3, 5]
> premiers.push(1)
5
> premiers.push(7)
6
> premiers
(6) [11, 2, 3, 5, 1, 7]
> premiers.unshift(13,17)
8
> premiers
(8) [13, 17, 11, 2, 3, 5, 1, 7]
> premiers.length
8

Pour créer un tableau il faut que les différents éléments soient séparés par des virgules et le tout encadré par des parenthèses.

Après avoir créé un tableau indicé, j'ai appliqué différentes méthodes qui modifient le tableau.

Pour connaitre le nombre d'éléments d'un tableau il faut utiliser la propriété length d'où l'absence de parenthèses.
Pour afficher le contenu du tableau il suffit de saisir son nom.

Notez que le tri des entiers du tableau nommé "premiers" donnne des résultats bizarres : 1, 11, 2, 3, 5, 7.
Par défaut, le tri s'effectue sur les éléments du tableau convertis en chaînes de caractères et triées selon les valeurs UTF-16 de ces caractères.

Programme manipulant un tableau

Nous allons voir les différentes techniques pour parcourir un tableau.

Le script

Ce tableau a initialement 4 items ayant respectivement les rangs 0 à 3.
Puis j'ajoute un élément en précisant son indice ... 6 ! Il s'agit alors d'un tableau avec 7 éléments dont deux non définis. Oui c'est possible, mais ce n'est pas conseillé.

Le rendu du script

Programme de création et manipulation d'un tableau indicé - autre exemple

Un tableau indicé est un objet de type ARRAY. Donc pour créer un tableau je peux utiliser la syntaxe POO : var nomTableau = new Array()
Ce script a aussi pour objet de vous familiariser avec d'autres méthodes d'un objet array qui n'ont pas encore été abordées.

Le code

Dans ce script : un petit rappel sur des méthodes déjà présentées : push(), unshift(), sort(), reverse(). Mais aussi d'autres méthodes ; voir la suite du script :

Le rendu de ce script

De nouvelles méthodes que l'on peut appliquer à un Array

Tri et inversion

ES2023 (version 2023 de JavaScript) ajoute les méthodes .toReversed() & .toSorted() aux objets de type Array.
La différence entre .toReversed() & .reverse() est que la première méthode crée un nouveau tableau, en gardant le tableau d'origine inchangé, tandis que la dernière méthode modifie le tableau d'origine.
La différence entre .toSorted() & .sort() est que la première méthode crée un nouveau tableau, en gardant le tableau d'origine inchangé tandis que la dernière méthode modifie le tableau d'origine.
Dans la console :

>liste = [9,5,3,7,1]
(5) [9, 5, 3, 7, 1]
>liste2 = liste.toSorted()
(5) [1, 3, 5, 7, 9]
>liste3 = liste.toReversed()
(5) [1, 7, 3, 5, 9]
>liste
(5) [9, 5, 3, 7, 1]
>liste.sort()
(5) [1, 3, 5, 7, 9]
>liste.reverse()
(5) [9, 7, 5, 3, 1]

Vous constatez que les méthodes .toSorted() & .toReversed() ne modifient pas l'ordre dans le tableau "liste" ce qui n'est pas le cas des méthodes .sort() & .reverse().

Tableaux en compréhension

Les méthodes map() & filter() appliquées à un objet array permettent de créer des listes en compréhension.
Dans la console :

> let premiers = [1,3,5,7,11]

> let carres = premiers.map(x=>x*x)

> carres
(5) [1, 9, 25, 49, 121]

> let chiffres = [1, 2, 3, 4,5,6,7,8,9]

> let pairs = chiffres.filter(x => x % 2 === 0)

> pairs
(4) [2, 4, 6, 8]

> let chiffres = [1, 2, 3, 4,5,6,7,8,9]

> double = chiffres.filter(x => x % 2 === 0).map(x => x * 2);
(4) [4, 8, 12, 16]

À partir du tableau "premiers" j'ai créé le tableau "carres" grâce à la méthode .map().
À partir du tableau "chiffres" j'ai créé le tableau "pairs" grâce à la méthode .filter().
Vous pouvez enchaîner les méthodes .map()& .filter() pour d'abord filtrer puis appliquer une fonction aux résultats filtrés.

Un "array" à deux dimensions

Rien n'interdit de créer des tableaux indicés à deux dimensions.

Théme: l'ULCO (Université de La Côte d'Opale) est une université multipolaire : quatre sites. Des personnels doivent faire des déplacements entre ces différents pôles. Afin de les indemniser, il est important de connaitre les distance entre les pôles.

Tableau des distances

****calaisboulognedunkerquesaint omer
calais0344644
boulogne3407654
dunkerque4676047
saint omer4454470

Il s'agit d'un tableau à double entrée (plusieurs colonnes et plusieurs lignes).

Le script correspondant

Le script pour créer ce tableau indicé à deux dimensions et le manipuler est le suivant.

En fait un tableau à deux dimensions et un tableau indicé dont chaque élément est lui-même un tableau indicé.
Dans l'exemple le tableau principal comprend cinq sous-tableaux. Chaque sous-tableau comprend 5 éléments.

Des instructions méritent une explication :
...distance[1][2] : pour récupérer un élément il faut préciser ses deux indices : rang colonne, rang ligne.

Le rendu du script (qui s'exécute automatiquement)

Pourquoi les tableaux ?

L'utilisation d'objets array peut simplifier considérablement la programmation.

Thématique : En fonction du rang du mois (entier compris entre 1 et 12) le programme doit afficher le nom du mois correspondant.
Ainsi si vous saisissez l'entier 5, le programme doit retourner "mai", si vous saisissez 11, il affiche "novembre".

Solution sans tableau

...
var rang_mois = prompt("Tapez le rang du mois , 1 pour janvier"); 
var rang_mois = parseInt(rang_mois); 
switch(rang_mois)
{
	case 1 : nom_mois ="janvier"; break ; 
	case 2 : nom_mois ="février"; break ;
		...
	case 11 : nom_mois ="novembre"; break ;
	case 12 : nom_mois ='décembre'; break ; 
} // fin switch 
document.write("Nom du mois correspondant : " + nom_mois); 
...

Un code très lourd !

Solution avec un tableau

var mois = 
	new Array(" ", "janvier", "février", "mars", "avril","mai", "juin", "juillet", 
	"aout","septembre", "octobre", "novembre", "décembre"); 
var rang_mois = prompt("Tapez le rang du mois - 1 pour janvier"); 
var rang_mois = parseInt(rang_mois); 
var nom_mois = mois[rang_mois]; 
document.write("Nom du mois correspondant : " + nom_mois);

Astuce : le premier élément d'un tableau a l'indice 0 (et non pas 1) donc le tableau comprend 13 items et le premier item est une chaine vide.
Le script est beaucoup plus succinct grâce à l'emploi d'un tableau.

Le rendu (dans un nouvel onglet, pensez à le fermer ensuite)

Testez le code !

Tableaux avec clés (dictionnaires)

Les tableaux avec clés OU tableaux "clé:valeur" OU tableaux associatifs OU dictionnaires ça existe enfin dans JavaScript depuis : ECMAScript6.

Pour créer un tableau associatif il faut utiliser le constructeur Map().

Ne confondez pas le constructeur Map() avec la méthode de .map() de l'objet array.

Exemple de tableau "clé/valeur"

Le script

Pour créer un tableau "clé:valeur" il faut utiliser le constructeur Map().

La propriété size (et non pas length) indique le nombre de paires "clé-valeur" dans le tableau.

Pour parcourir un objet Map il faut utiliser la structure for (let ... of nomMap.méthode())

Le rendu

Les ensembles ou "set"

Si vous connaissez le langage Python, vous savez qu'il existe une structure de données qui s'appelle "set" ("ensemble" en français). Dans une séquence de type "set" il ne peut pas y avoir de doublons : valeurs uniques.
La dernière version de JavaScript propose désormais ce type de données.

Script à produire

...
let cartes = new Set(['as','roi', 'dame', 'valet',10,9,8,7]); 
cartes.add(7);
console.log (cartes.size);  
console.log (cartes.has(5));
console.log (cartes.has('roi')); 
for (let item of cartes) 
	{console.log(item); }
cartes.add(6).add(5).add(4).add(3).add(2).add(8); 
console.log(cartes.size); 

for (let item of cartes) 
	{console.log(item); }
...

Commentaire

Pour créer un nouvel ensemble, il faut utiliser le constructeur Set().
La taille de l'ensemble est de 8 (l'ajout de 7 n'ayant pas été pris en compte) ; cependant il n'y a pas eu plantage de la commande.

Pour parcourir un "set" on utilise la même syntaxe que pour un "map".
Notez qu'il existe aussi les méthodes has(),clear(), delete() (comme pour pour le type "map').
Par contre l'ajout d'un item se fait avec la méthode .add() (et non pas .set()) et on comprend pourquoi ...

La tentative d'ajout d'un 8 échoue puisque cette valeur existe déjà. La taille de l'ensemble fait désormais 13. Il ne peut jamais y avoir de doublons dans un ensemble.

Utilité de la structure set

Dans le script ci-dessous le joueur obtient une "main" de 5 cartes toutes différentes car cette "main" est stockée dans un tableau de type "set".
La simplicité du programme est dûe à l'emploi d'un objet de type "set" qui interdit les doublons.

Le code la page

Création d'un set vide nommé "ma_main".

La boucle FOR infinie va être exécutée au moins 5 fois.
Dans l'instruction ma_main = ma_main.add(carte) l'ajout à "ma_main" n'est pas automatique ; il se fait seulement si la valeur de "carte" n'existe pas encore dans "ma_main".

Le rendu

Actualisez la page pour afficher de nouveau le bouton de commande.

Pour vérifier si vous avez compris le code, créez une nouvelle version : tirage dans un jeu de 52 cartes et la "main" doit être une combinaison de 7 cartes toutes différentes.