Manipulez les listes en JavaScript

Vous disposez dĂ©sormais d’une page web gĂ©nĂ©rĂ©e automatiquement par votre code JavaScript, grĂące au DOM et Ă  partir de donnĂ©es JSON que vous avez modifiĂ©es. Encore bravo ! đŸ„ł

Ceci dit, vous avez peut-ĂȘtre remarquĂ© que cette page est statique : vous ne pouvez pas interagir avec elle. De mĂȘme, votre page n’affiche pour l’instant qu’un produit, alors que le fichier JSON en contient cinq. Pour rĂ©soudre ces problĂšmes, dĂ©couvrons ensemble les listes, et comment les manipuler. 😃

Affichez plusieurs éléments en parcourant les listes

Pour gĂ©nĂ©rer notre page web au chapitre prĂ©cĂ©dent, nous avons utilisĂ© les fonctions document.createElement et appendChild. Le code auquel nous avons abouti nous a permis de gĂ©nĂ©rer une fiche produit. Pour en gĂ©nĂ©rer plusieurs, nous allons devoir rĂ©pĂ©ter ce code. Une fois toutes ces fiches affichĂ©es Ă  l’écran, nous voudrons les rĂ©ordonner selon leur prix, ou les trier pour ne garder que celles disponibles. Pour cela, nous utiliserons les listes et leurs mĂ©thodes de manipulation.

Affichez plusieurs fiches produits grĂące Ă  la boucle for

Peut-ĂȘtre connaissez-vous dĂ©jĂ  l’élĂ©ment qui permet de rĂ©pĂ©ter du code en JavaScript : les boucles ! Si ce n’est pas le cas, n’hĂ©sitez pas Ă  faire un tour sur ce chapitre du cours Apprenez Ă  programmer avec JavaScript. Il existe trois boucles diffĂ©rentes :

  • la boucle while permet de rĂ©pĂ©ter des instructions tant qu’une condition de test est vraie ;

  • la boucle do while permet d'exĂ©cuter au moins une fois une instruction avant de vĂ©rifier s’il faut la rĂ©pĂ©ter ;

  • la boucle for est utilisĂ©e lorsqu’on sait Ă  l’avance combien de fois on doit exĂ©cuter la boucle.

Dans notre cas, nous pouvons entourer notre code de gĂ©nĂ©ration avec une boucle for. Cela aura pour consĂ©quence de crĂ©er toutes les fiches produits de notre site, en un clin d'Ɠil. Pratique, non ? 😉

Pour utiliser la boucle for, nous allons donc écrire :

for (let i = 0; i < pieces.length; i++) {

// Récupération de l'élément du DOM qui accueillera les fiches
const sectionFiches = document.querySelector(".fiches");
// CrĂ©ation d’une balise dĂ©diĂ©e Ă  une piĂšce automobile
const pieceElement = document.createElement("article");
// On crĂ©e l’élĂ©ment img.
const imageElement = document.createElement("img");
// On accùde à l’indice i de la liste pieces pour configurer la source de l’image.
imageElement.src = pieces[i].image;
// Idem pour le nom, le prix et la catégorie...

// On rattache la balise article Ă  la section Fiches
sectionFiches.appendChild(pieceElement);
// On rattache l’image à pieceElement (la balise article)
pieceElement.appendChild(imageElement);
// Idem pour le nom, le prix et la catégorie...
}

Pour obtenir le rĂ©sultat attendu, nous devons d’abord mettre Ă  jour le fichier CSS. Rendez-vous sur le dĂ©pĂŽt GitHub pour rĂ©cupĂ©rer cette version actualisĂ©e du CSS.

Et voici ce que cela donne :

Capture d'écran du sites des Bonnes PiÚces. Les 5 produits sont affichés au milieu de l'écran.
Le site des Bonnes PiĂšces affiche les cinq fiches produits

Toutes nos piĂšces s’affichent sur l’écran ! đŸ„ł

Réordonnez et filtrez les fiches produits grùce aux fonctions sort et filter

Nous souhaitons maintenant ajouter des capacités de filtrage et de tri pour permettre aux utilisateurs de trouver plus rapidement les piÚces qui les intéressent. Regardons ensemble comment filtrer, réordonner et supprimer les piÚces grùce aux événements et à la manipulation des listes en JavaScript.

Dans ce cours, nous utilisons le terme de fonctions sort et filter par souci de vulgarisation. Mais en rĂ©alitĂ©, il s’agit plus prĂ©cisĂ©ment de mĂ©thodes de tableau. C’est ainsi que l’on nomme une fonction dĂ©finie Ă  l’intĂ©rieur d’un objet. 😉

Je vous propose de passer sur la branche P2C1-BoucleFor du dĂ©pĂŽt de code source. Vous verrez que j’ai ajoutĂ© deux boutons sur notre page.

Ces derniers permettront à l’utilisateur d’interagir avec le contenu pour le filtrer et l’ordonner :

  • un bouton “Trier par prix croissants” ;

  • un bouton “Filtrer les piĂšces non abordables”.

Réordonnez les fiches produits grùce à la fonction sort

Notre premiĂšre Ă©tape consiste donc Ă  ajouter un listener au bouton “Trier par prix croissants”. Cela permettra de modifier l’ordre des piĂšces en fonction de leur prix.

AprÚs notre boucle for, on écrit donc :

const boutonTrier = document.querySelector(".btn-trier");
boutonTrier.addEventListener("click", function () {
    // ...
});

Puis il nous faut rĂ©ordonner les Ă©lĂ©ments de la liste en fonction de leur prix. Pour cela, nous utilisons la fonction sort qui prend en argument
 une nouvelle fonction. Nous dĂ©clarons celle-ci Ă  l’intĂ©rieur des parenthĂšses de sort, sans lui donner de nom. On dit qu’elle est anonyme. Cette fonction anonyme sera appelĂ©e par sort pour comparer deux Ă©lĂ©ments entre eux.

L’extrait de code ci-dessous reprĂ©sente la dĂ©claration d’une fonction anonyme au moment de l’appel Ă  la fonction sort :

pieces.sort(function (...) {
    ...
});

Dans le cas de sort, la fonction anonyme prend deux paramĂštres qu’il faudra comparer pour dire lequel doit ĂȘtre rangĂ© avant l’autre dans la liste rĂ©ordonnĂ©e finale. Traditionnellement, on nomme ces deux paramĂštres A et B.

Illustration de la fonction sort composée d'une fonction anonyme qui prend deux paramÚtres A et B : sort(function (a,b)).
La fonction anonyme prend deux paramĂštres a et b

Heuu
 Tu n’aurais pas un exemple à nous donner ? 😅

Bien sĂ»r ! Prenons l’exemple de l’ampoule LED qui vaut 60 € (Ă©lĂ©ment A), et du liquide de frein qui vaut 9,60 € (Ă©lĂ©ment B). Nous souhaitons ranger le liquide de frein (B) avant l’ampoule LED (A) car c’est le moins cher des deux. La fonction anonyme devra donc retourner une valeur nĂ©gative. En soustrayant les prix des deux piĂšces avec le calcul B - A, on obtient 9,60 - 60 = -50,40. La fonction sort comprendra donc qu’il faut ranger le liquide de frein avant l’ampoule LED.

Voici le code complet qui permet de réordonner les éléments de la liste pieces lors du clic sur le bouton Trier :

const boutonTrier = document.querySelector(".btn-trier");
boutonTrier.addEventListener("click", function () {
    pieces.sort(function (a, b) {
        return a.prix - b.prix;
    });
    console.log(pieces);
});

Quand j’écris ton code, les fiches produits restent dans le mĂȘme ordre. Pourquoi l’écran ne change pas ?

La fonction sort modifie la liste qu’elle rĂ©ordonne “en place” (in-place, en anglais). Cela veut dire que les Ă©lĂ©ments de la liste changent de place. Cela pose un problĂšme car la liste d’origine avec l’ordre d’origine est aussi modifiĂ©e. Pour rĂ©soudre ce problĂšme, nous pouvons crĂ©er une copie de la liste avec la fonction Array.from. Nous Ă©crirons donc :

// Gestion des boutons
const boutonTrier = document.querySelector(".btn-trier");

boutonTrier.addEventListener("click", function () {
  const piecesOrdonnees = Array.from(pieces);

  piecesOrdonnees.sort(function (a, b) {
    return a.prix - b.prix;
  });

  console.log(piecesOrdonnees);
});
Filtrez les Ă©lĂ©ments d’une liste grĂące Ă  la fonction filter

Maintenant que nous avons gĂ©rĂ© le tri des piĂšces, ajoutons un listener sur le bouton “Filtrer les piĂšces non abordables” pour n’afficher que les piĂšces dont le prix est infĂ©rieur ou Ă©gal Ă  35 €.

On écrira donc :

const boutonFiltrer = document.querySelector(".btn-filtrer");
boutonFiltrer.addEventListener("click", function () {
    // ...
});

La fonction anonyme doit retourner une valeur booléenne :

  • true si l’élĂ©ment doit se trouver dans la liste filtrĂ©e ;

  • false si l’élĂ©ment ne doit pas se trouver dans la liste filtrĂ©e.

Dans notre exemple, le fichier JSON contient l’information du prix du produit. Le code pour filtrer les piĂšces indisponibles s’écrit donc :

const boutonFiltrer = document.querySelector(".btn-filtrer");

boutonFiltrer.addEventListener("click", function () {
   const piecesFiltrees = pieces.filter(function (piece) {
       return piece.prix <= 35;
   });
   ;

Lorsque ce code s’exĂ©cute, la constante piecesFiltrees contient une nouvelle liste avec uniquement les piĂšces disponibles, Ă  savoir : l’ampoule LED, les plaquettes de frein et le liquide de frein.

Récapitulons en vidéo

Vous pouvez revoir les différentes étapes de ce chapitre dans la vidéo ci-dessous :

À vous de jouer !

Depuis la branche P2C1-Exercice, éditez les fichiers pieces.js et index.html pour y ajouter les fonctionnalités suivantes :

  • filtrer la liste des piĂšces pour n’afficher que celles qui ont une description, Ă  l’aide d’un bouton que vous ajouterez dans le HTML ;

  • ordonner les listes selon le prix en ordre dĂ©croissant, Ă  l’aide d’un bouton que vous ajouterez dans le HTML.

Corrigé

Vous pouvez vérifier votre travail en consultant la branche P2C1-Solution et en regardant la vidéo ci-dessous :

En résumé

  • Pour parcourir vos donnĂ©es afin de gĂ©nĂ©rer autant d’élĂ©ments du DOM qu’il y a d’élĂ©ments dans vos listes, vous pouvez utiliser la boucle for.

  • Utilisez les 2 mĂ©thodes suivantes pour manipuler vos tableaux en fonction de vos besoins :

    • Utilisez la fonction sort pour rĂ©ordonner les Ă©lĂ©ments.

    • Utilisez la fonction filter pour Ă©liminer les Ă©lĂ©ments non dĂ©sirĂ©s et conserver les Ă©lĂ©ments choisis.

Et voilĂ , vous savez maintenant manipuler des listes en JavaScript ! Continuons d’explorer les capacitĂ©s des listes dans le prochain chapitre avec la fonction map.

Et si vous obteniez un diplĂŽme OpenClassrooms ?
  • Formations jusqu’à 100 % financĂ©es
  • Date de dĂ©but flexible
  • Projets professionnalisants
  • Mentorat individuel
Trouvez la formation et le financement faits pour vous