Javascript fondamentaux
Thème :
Intermédiaire
2 vues ·15/19 leçons

Map, Filter, Reduce et Événements Focus/Blur (Explications Détaillées)


1️⃣ La Méthode MAP - Transformer les données

Qu’est-ce que map ?

map crée un nouveau tableau en transformant chaque élément du tableau original. C’est comme appliquer une formule à chaque élément.

Syntaxe simple

const nouveauTableau = tableau.map((element) => {
    // Transformer l'élément
    return element * 2;
});

🔍 Comprendre les paramètres

const nombres = [1, 2, 3, 4, 5];

// Paramètre 1 : element (l'élément courant)
const doubles = nombres.map((element) => element * 2);
console.log(doubles); // [2, 4, 6, 8, 10]

// Paramètre 2 : index (la position)
const avecIndex = nombres.map((element, index) => {
    return `Position ${index}: ${element}`;
});
console.log(avecIndex);
// ["Position 0: 1", "Position 1: 2", "Position 2: 3", ...]

// Paramètre 3 : tableau (le tableau original)
const avecTableau = nombres.map((element, index, tableau) => {
    return element + tableau.length; // Ajouter la longueur du tableau
});
console.log(avecTableau); // [6, 7, 8, 9, 10]

💡 Exemples pratiques

Exemple 1 : Doubler les nombres

const nombres = [1, 2, 3, 4, 5];
const doubles = nombres.map((nombre) => nombre * 2);
console.log(doubles); // [2, 4, 6, 8, 10]

Exemple 2 : Convertir des chaînes en nombres

const textes = ['10', '20', '30'];
const nombres = textes.map((texte) => parseInt(texte));
console.log(nombres); // [10, 20, 30]

Exemple 3 : Ajouter un index à une liste de fruits

const fruits = ['pomme', 'banane', 'cerise'];
const fruitsNumerotes = fruits.map((fruit, index) => {
    return `${index + 1}. ${fruit}`;
});
console.log(fruitsNumerotes);
// ["1. pomme", "2. banane", "3. cerise"]

Exemple 4 : Transformer des objets

const utilisateurs = [
    { nom: 'Eva', age: 25 },
    { nom: 'Owen', age: 30 },
    { nom: 'Diane', age: 28 },
];

// Extraire seulement les noms
const noms = utilisateurs.map((user) => user.nom);
console.log(noms); // ["Eva", "Owen", "Diane"]

// Créer une présentation
const presentations = utilisateurs.map((user) => `${user.nom} a ${user.age} ans`);
console.log(presentations);
// ["Eva a 25 ans", "Owen a 30 ans", "Diane a 28 ans"]

Exemple 5 : Élever au carré

const nombres = [1, 2, 3, 4, 5];
const carres = nombres.map((n) => n * n);
console.log(carres); // [1, 4, 9, 16, 25]

⚠️ Points importants sur map

Point Explication
Immutabilité Le tableau original ne change pas
Longueur Le nouveau tableau a la même longueur
Retour obligatoire Chaque fonction doit retourner une valeur
Ordre Les éléments gardent le même ordre
const original = [1, 2, 3];
const transforme = original.map((n) => n * 2);

console.log(original); // [1, 2, 3] (inchangé)
console.log(transforme); // [2, 4, 6] (nouveau tableau)

2️⃣ La Méthode FILTER - Sélectionner les données

Qu’est-ce que filter ?

filter crée un nouveau tableau contenant seulement les éléments qui passent un test (retournent true).

📝 Syntaxe simple

const nouveauTableau = tableau.filter((element) => {
    return condition; // true ou false
});

🔍 Comprendre le fonctionnement

const nombres = [1, 2, 3, 4, 5, 6];

// Garder seulement les nombres pairs
const pairs = nombres.filter((nombre) => nombre % 2 === 0);
console.log(pairs); // [2, 4, 6]

// Garder seulement les nombres > 3
const grands = nombres.filter((nombre) => nombre > 3);
console.log(grands); // [4, 5, 6]

💡 Exemples pratiques

Exemple 1 : Filtrer les nombres pairs

const nombres = [1, 2, 3, 4, 5, 6, 7, 8];
const pairs = nombres.filter((n) => n % 2 === 0);
console.log(pairs); // [2, 4, 6, 8]

Exemple 2 : Filtrer les nombres supérieurs à une valeur

const nombres = [10, 5, 20, 3, 15];
const superieurA10 = nombres.filter((n) => n > 10);
console.log(superieurA10); // [20, 15]

Exemple 3 : Filtrer les utilisateurs par âge

const utilisateurs = [
    { nom: 'Eva', age: 25 },
    { nom: 'Owen', age: 30 },
    { nom: 'Diane', age: 28 },
    { nom: 'Alice', age: 22 },
];

// Garder seulement les utilisateurs majeurs (>= 25)
const majeurs = utilisateurs.filter((user) => user.age >= 25);
console.log(majeurs);
// [{ nom: 'Eva', age: 25 }, { nom: 'Owen', age: 30 }, { nom: 'Diane', age: 28 }]

Exemple 4 : Filtrer les chaînes non vides

const textes = ['hello', '', 'world', '', 'javascript'];
const nonVides = textes.filter((texte) => texte.length > 0);
console.log(nonVides); // ["hello", "world", "javascript"]

Exemple 5 : Filtrer les produits par prix

const produits = [
    { nom: 'iPhone', prix: 999 },
    { nom: 'Livre', prix: 15 },
    { nom: 'MacBook', prix: 1499 },
    { nom: 'Stylo', prix: 2 },
];

// Produits moins chers que 100€
const abordables = produits.filter((p) => p.prix < 100);
console.log(abordables);
// [{ nom: 'Livre', prix: 15 }, { nom: 'Stylo', prix: 2 }]

⚠️ Points importants sur filter

Point Explication
Immutabilité Le tableau original ne change pas
Longueur variable Le nouveau tableau peut être plus court
Retour booléen La fonction doit retourner true ou false
Éléments conservés Seuls les éléments true sont gardés
const original = [1, 2, 3, 4, 5];
const filtre = original.filter((n) => n > 2);

console.log(original); // [1, 2, 3, 4, 5] (inchangé)
console.log(filtre); // [3, 4, 5] (plus court)

3️⃣ La Méthode REDUCE - Agréger les données

Qu’est-ce que reduce ?

reduce transforme un tableau en une seule valeur en accumulant les résultats. C’est comme faire un calcul global sur tous les éléments.

📝 Syntaxe

const resultat = tableau.reduce((accumulateur, element) => {
    return accumulateur + element;
}, valeurInitiale);

🔍 Comprendre l’accumulateur

L’accumulateur est une variable qui accumule les résultats à chaque itération.

const nombres = [1, 2, 3, 4, 5];

// Calculer la somme
const somme = nombres.reduce((acc, nombre) => {
    console.log(`acc: ${acc}, nombre: ${nombre}`);
    return acc + nombre;
}, 0);

console.log(somme); // 15

// Affichage du processus :
// acc: 0, nombre: 1  → retourne 1
// acc: 1, nombre: 2  → retourne 3
// acc: 3, nombre: 3  → retourne 6
// acc: 6, nombre: 4  → retourne 10
// acc: 10, nombre: 5 → retourne 15

💡 Exemples pratiques

Exemple 1 : Calculer la somme

const nombres = [1, 2, 3, 4, 5];
const somme = nombres.reduce((acc, n) => acc + n, 0);
console.log(somme); // 15

Exemple 2 : Calculer le produit

const nombres = [1, 2, 3, 4, 5];
const produit = nombres.reduce((acc, n) => acc * n, 1);
console.log(produit); // 120

Exemple 3 : Compter les occurrences (objet)

const fruits = ['pomme', 'banane', 'pomme', 'orange', 'banane', 'pomme'];

const compte = fruits.reduce((acc, fruit) => {
    acc[fruit] = (acc[fruit] || 0) + 1;
    return acc;
}, {});

console.log(compte);
// { pomme: 3, banane: 2, orange: 1 }

Exemple 4 : Trouver le maximum

const nombres = [5, 2, 8, 1, 9, 3];
const max = nombres.reduce((acc, n) => (n > acc ? n : acc));
console.log(max); // 9

Exemple 5 : Grouper des objets

const utilisateurs = [
    { nom: 'Eva', ville: 'Lyon' },
    { nom: 'Owen', ville: 'Paris' },
    { nom: 'Diane', ville: 'Lyon' },
    { nom: 'Alice', ville: 'Paris' },
];

const parVille = utilisateurs.reduce((acc, user) => {
    if (!acc[user.ville]) {
        acc[user.ville] = [];
    }
    acc[user.ville].push(user.nom);
    return acc;
}, {});

console.log(parVille);
// {
//   Lyon: ["Eva", "Diane"],
//   Paris: ["Owen", "Alice"]
// }

Exemple 6 : Aplatir un tableau

const tableaux = [
    [1, 2],
    [3, 4],
    [5, 6],
];
const aplati = tableaux.reduce((acc, arr) => acc.concat(arr), []);
console.log(aplati); // [1, 2, 3, 4, 5, 6]

⚠️ Points importants sur reduce

Point Explication
Valeur initiale Très important de la définir
Accumulateur Accumule les résultats
Retour unique Retourne une seule valeur
Ordre Traite les éléments dans l’ordre
// SANS valeur initiale (risqué)
const nombres = [1, 2, 3];
const somme = nombres.reduce((acc, n) => acc + n);
// acc commence à 1, puis 2, puis 3

// AVEC valeur initiale (recommandé)
const somme2 = nombres.reduce((acc, n) => acc + n, 0);
// acc commence à 0

4️⃣ Événements FOCUS et BLUR

Qu’est-ce que focus et blur ?

  • focus : L’élément reçoit l’attention (l’utilisateur clique ou utilise Tab)
  • blur : L’élément perd l’attention (l’utilisateur clique ailleurs)

📝 Syntaxe

const input = document.querySelector('input');

// Quand l'input reçoit le focus
input.addEventListener('focus', () => {
    console.log('Focus reçu');
});

// Quand l'input perd le focus
input.addEventListener('blur', () => {
    console.log('Focus perdu');
});

💡 Exemples pratiques

Exemple 1 : Changer la couleur au focus

<input type="text" id="nom" placeholder="Entrez votre nom" />

<style>
    input.active {
        background-color: lightyellow;
        border: 2px solid blue;
    }
</style>
const input = document.getElementById('nom');

input.addEventListener('focus', () => {
    input.classList.add('active');
});

input.addEventListener('blur', () => {
    input.classList.remove('active');
});

Exemple 2 : Valider un email au blur

const emailInput = document.querySelector('input[type="email"]');

emailInput.addEventListener('blur', () => {
    const email = emailInput.value;

    if (!email.includes('@')) {
        emailInput.style.borderColor = 'red';
        console.log('Email invalide');
    } else {
        emailInput.style.borderColor = 'green';
        console.log('Email valide');
    }
});

Exemple 3 : Afficher/masquer un message d’aide

<input type="password" id="motDePasse" placeholder="Mot de passe" />
<p id="aide" style="display: none;">Le mot de passe doit contenir au moins 8 caractères</p>
const input = document.getElementById('motDePasse');
const aide = document.getElementById('aide');

input.addEventListener('focus', () => {
    aide.style.display = 'block';
});

input.addEventListener('blur', () => {
    aide.style.display = 'none';
});

Exemple 4 : Sauvegarder automatiquement

const textarea = document.querySelector('textarea');

textarea.addEventListener('blur', () => {
    const contenu = textarea.value;
    localStorage.setItem('brouillon', contenu);
    console.log('Brouillon sauvegardé');
});

textarea.addEventListener('focus', () => {
    const brouillon = localStorage.getItem('brouillon');
    if (brouillon) {
        textarea.value = brouillon;
    }
});

Exemple 5 : Compter les caractères

<input type="text" id="bio" placeholder="Votre bio" maxlength="100" />
<p id="compteur">0/100</p>
const input = document.getElementById('bio');
const compteur = document.getElementById('compteur');

input.addEventListener('focus', () => {
    compteur.style.display = 'block';
});

input.addEventListener('blur', () => {
    compteur.style.display = 'none';
});

input.addEventListener('input', () => {
    const longueur = input.value.length;
    compteur.textContent = `${longueur}/100`;
});

5️⃣ ForEach - Boucler sur les éléments

Qu’est-ce que forEach ?

forEach exécute une fonction pour chaque élément du tableau. C’est comme une boucle for mais plus moderne.

📝 Syntaxe

tableau.forEach((element, index) => {
    // Faire quelque chose
});

💡 Exemples pratiques

Exemple 1 : Ajouter un écouteur à plusieurs éléments

<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
const boxes = document.querySelectorAll('.box');

boxes.forEach((box) => {
    box.addEventListener('click', () => {
        box.style.backgroundColor = 'blue';
    });
});

Exemple 2 : Afficher chaque élément

const fruits = ['pomme', 'banane', 'cerise'];

fruits.forEach((fruit, index) => {
    console.log(`${index + 1}. ${fruit}`);
});
// 1. pomme
// 2. banane
// 3. cerise

Exemple 3 : Modifier le style de plusieurs éléments

const boxes = document.querySelectorAll('.box');

boxes.forEach((box, index) => {
    box.style.transform = `scale(${1 - index * 0.1})`;
    box.style.opacity = `${1 - index * 0.1}`;
});

Exemple 4 : Ajouter des classes

const elements = document.querySelectorAll('p');

elements.forEach((el, index) => {
    if (index % 2 === 0) {
        el.classList.add('pair');
    } else {
        el.classList.add('impair');
    }
});

📊 Comparaison : Map vs Filter vs Reduce

Méthode Utilité Retour Exemple
map Transformer Nouveau tableau [1,2,3].map(n => n*2) → [2,4,6]
filter Sélectionner Nouveau tableau [1,2,3].filter(n => n>1) → [2,3]
reduce Agréger Une seule valeur [1,2,3].reduce((a,n) => a+n, 0) → 6
forEach Boucler Rien Exécute pour chaque élément

Combinaisons pratiques

Utiliser map et filter ensemble

const utilisateurs = [
    { nom: 'Eva', age: 25, ville: 'Lyon' },
    { nom: 'Owen', age: 30, ville: 'Paris' },
    { nom: 'Diane', age: 28, ville: 'Lyon' },
    { nom: 'Alice', age: 22, ville: 'Paris' },
];

// Récupérer les noms des utilisateurs de plus de 25 ans
const nomsAdultes = utilisateurs.filter((user) => user.age > 25).map((user) => user.nom);

console.log(nomsAdultes); // ["Owen", "Diane"]

Utiliser filter et reduce ensemble

const produits = [
    { nom: 'iPhone', prix: 999, categorie: 'electronique' },
    { nom: 'Livre', prix: 15, categorie: 'culture' },
    { nom: 'MacBook', prix: 1499, categorie: 'electronique' },
    { nom: 'Stylo', prix: 2, categorie: 'fourniture' },
];

// Calculer le prix total des produits électroniques
const totalElectronique = produits.filter((p) => p.categorie === 'electronique').reduce((acc, p) => acc + p.prix, 0);

console.log(totalElectronique); // 2498

Utiliser map, filter et reduce ensemble

const commandes = [
    { id: 1, articles: [{ prix: 10 }, { prix: 20 }] },
    { id: 2, articles: [{ prix: 5 }] },
    { id: 3, articles: [{ prix: 100 }, { prix: 50 }] },
];

// Calculer le total des commandes avec plus de 1 article
const total = commandes
    .filter((cmd) => cmd.articles.length > 1)
    .map((cmd) => cmd.articles.reduce((acc, art) => acc + art.prix, 0))
    .reduce((acc, prix) => acc + prix, 0);

console.log(total); // 180

🎓 Résumé des points clés

✅ map = Transformer chaque élément ✅ filter = Garder seulement certains éléments ✅ reduce = Combiner tous les éléments en une valeur ✅ forEach = Faire quelque chose pour chaque élément ✅ focus = Élément reçoit l’attention ✅ blur = Élément perd l’attention

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Map, Filter, Reduce et Événements Focus/Blur (Explications Détaillées). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.