Méthodes avancées pour les tableaux

Les méthodes avancées pour les tableaux : map, filter, reduce, find, etc.

Données d'exemple

const resistanceAuGommage = [85, 92, 78, 96, 89, 73, 91, 88];
const expeditionnaires = [
    { nom: 'Gustave', resistance: 85, role: 'Ingénieur' },
    { nom: 'Maelle', resistance: 92, role: 'Exploratrice' },
    { nom: 'Lune', resistance: 78, role: 'Chercheuse' },
    { nom: 'Sciel', resistance: 96, role: 'Enseignante' },
    { nom: 'Verso', resistance: 89, role: 'Mystérieux' },
    { nom: 'Renoir', resistance: 73, role: 'Sauveur' },
    { nom: 'Monoco', resistance: 91, role: 'Gestral' }
];

1. MAP() - Transformer chaque élément

// But: Crée un nouveau tableau en appliquant une fonction à chaque élément
// ATTENTION: Ne modifie PAS le tableau original

const resistanceRenforcee = resistanceAuGommage.map(resistance => resistance + 10);
console.log("Résistance après entraînement:", resistanceRenforcee);

const codesLumiere = expeditionnaires.map(membre => membre.nom.toUpperCase());
console.log("Codes de Lumière:", codesLumiere);

const fichesExpedition = expeditionnaires.map((membre, index) => 
    `#${index + 1}: ${membre.nom} - ${membre.resistance}/100 résistance (${membre.role})`
);
console.log("Fiches anti-Gommage:", fichesExpedition);

2. FILTER() - Filtrer selon une condition

// But: Retourne un nouveau tableau avec les éléments qui passent le test
// ATTENTION: Ne modifie PAS le tableau original

const survivantsElite = resistanceAuGommage.filter(resistance => resistance >= 90);
console.log("Survivants (≥90):", survivantsElite);

const chercheurs = expeditionnaires.filter(membre => membre.role === 'Chercheuse');
console.log("Équipe de recherche:", chercheurs);

const veteransLumiere = expeditionnaires.filter(membre => membre.resistance > 85 && membre.nom.length > 4);
console.log("Vétérans de Lumière:", veteransLumiere);

3. REDUCE() - Réduire à une seule valeur

// But: Accumule les éléments du tableau en une seule valeur
// Paramètres: (accumulateur, valeurActuelle, index, tableau)

const moyenneResistance = resistanceAuGommage.reduce((somme, resistance) => somme + resistance, 0) / resistanceAuGommage.length;
console.log("Résistance moyenne:", moyenneResistance.toFixed(2));

const meilleureResistance = resistanceAuGommage.reduce((max, resistance) => resistance > max ? resistance : max, 0);
console.log("Meilleure résistance:", meilleureResistance);

const repartitionRoles = expeditionnaires.reduce((compteur, membre) => {
    compteur[membre.role] = (compteur[membre.role] || 0) + 1;
    return compteur;
}, {});
console.log("Répartition par rôle:", repartitionRoles);

4. FOREACH() - Exécuter une action sur chaque élément

// But: Exécute une fonction pour chaque élément
// ATTENTION: Ne retourne RIEN (undefined)

console.log("Rapport de mission:");
expeditionnaires.forEach((membre, position) => {
    const statut = membre.resistance >= 90 ? "Héros" : 
                   membre.resistance >= 80 ? "Combattant" : "En danger";
    console.log(`   ${position + 1}. ${membre.nom}: ${membre.resistance}/100 ${statut}`);
});

5. FIND() - Trouver le premier élément correspondant

// But: Retourne le PREMIER élément qui satisfait la condition
// Retourne undefined si rien n'est trouvé

const premierHeros = resistanceAuGommage.find(resistance => resistance >= 95);
console.log("Premier héros (≥95):", premierHeros);

const membreGustave = expeditionnaires.find(membre => membre.nom === 'Gustave');
console.log("Ingénieur Gustave:", membreGustave);

const gestral = expeditionnaires.find(membre => membre.role === 'Gestral');
console.log("Guerrier Gestral:", gestral);

6. SOME() - Vérifier si AU MOINS UN élément correspond

// But: Retourne true si AU MOINS UN élément satisfait la condition

const aDesHeros = resistanceAuGommage.some(resistance => resistance >= 95);
console.log("Y a-t-il des héros (≥95)?", aDesHeros);

const aDesGestrals = expeditionnaires.some(membre => membre.role === 'Gestral');
console.log("Y a-t-il des Gestrals dans l'équipe?", aDesGestrals);

7. EVERY() - Vérifier si TOUS les éléments correspondent

// But: Retourne true si TOUS les éléments satisfont la condition

const tousSurvivront = resistanceAuGommage.every(resistance => resistance >= 70);
console.log("Tous survivront-ils au Gommage (≥70)?", tousSurvivront);

const tousOntResistance = expeditionnaires.every(membre => membre.resistance > 0);
console.log("Tous ont-ils une résistance?", tousOntResistance);

8. INCLUDES() - Vérifier la présence d'une valeur

// But: Vérifie si le tableau contient une valeur spécifique

const artefactsLumiere = ['Pinceau', 'Toile', 'Luminoïde', 'Cristal', 'Ombre'];
console.log("Artefacts de Lumière:", artefactsLumiere);
console.log("Contient 'Pinceau'?", artefactsLumiere.includes('Pinceau'));
console.log("Contient 'Gommage'?", artefactsLumiere.includes('Gommage'));

9. INDEXOF() - Trouver l'index d'une valeur

// But: Retourne l'index d'une valeur, ou -1 si non trouvé

const zones = ['Lumière', 'Ombre', 'Clair-Obscur', 'Néant'];
console.log("Zones explorées:", zones);
console.log("Index de 'Clair-Obscur':", zones.indexOf('Clair-Obscur'));
console.log("Index de 'Paradis':", zones.indexOf('Paradis')); // -1

10. SPLIT() - Diviser une chaîne en tableau

// But: Divise une chaîne de caractères en tableau
// ATTENTION: C'est une méthode de String, pas de Array!

const prophétie = "La Peintresse gommera tous les habitants de Lumière";
const mots = prophétie.split(" ");
console.log("Prophétie:", prophétie);
console.log("Mots de la prophétie:", mots);

const coordonnees = "Expédition@Lumière.monde";
const [mission, lieu] = coordonnees.split("@");
console.log(`Mission: ${mission}, Lieu: ${lieu}`);

11. JOIN() - Joindre les éléments en chaîne

// But: Joint les éléments du tableau en une chaîne

const pouvoirs = ['Résistance', 'Vision', 'Combat', 'Magie'];
const arsenal = pouvoirs.join(" • ");
console.log("Arsenal de l'expédition:", arsenal);

const parcours = ['Lumière', 'Ombre', 'Clair-Obscur', 'Repaire-Peintresse'];
const route = parcours.join(" > ");
console.log("Route de l'expédition:", route);

12. SPLICE() - Modifier le tableau en place

// But: Ajoute/supprime des éléments du tableau
// ATTENTION: MODIFIE le tableau original !
// Syntaxe: splice(début, nombreÀSupprimer, ...élémentsÀAjouter)

const menaces = ['Gommage', 'Ombre', 'Peintresse', 'Néant'];
console.log("Menaces avant:", [...menaces]);

// Remplacer 'Peintresse' par 'Espérance'
const neutralisées = menaces.splice(2, 1, 'Espérance');
console.log("Menaces après neutralisation:", menaces);
console.log("Menaces neutralisées:", neutralisées);

// Ajouter une nouvelle menace
menaces.splice(2, 0, 'Corruption');
console.log("Après découverte:", menaces);

13. SLICE() - Extraire une portion

// But: Retourne une copie superficielle d'une portion du tableau
// ATTENTION: Ne modifie PAS le tableau original

const chronologie = ['Création', 'Apogée', 'Déclin', 'Gommage', 'Résistance', 'Expédition'];
console.log("Histoire complète:", chronologie);

const origines = chronologie.slice(0, 3);
console.log("3 premières époques:", origines);

const finDesTemps = chronologie.slice(-3);
console.log("3 dernières époques:", finDesTemps);

const criseActuelle = chronologie.slice(2, 5);
console.log("Crise actuelle:", criseActuelle);

14. SET - Collection de valeurs uniques

// But: Stocke uniquement des valeurs uniques (pas de doublons)
// ATTENTION: Ce n'est pas une méthode de Array, mais très utile avec !

const temoignagesGommage = [85, 90, 85, 92, 90, 88, 92, 85];
console.log("Témoignages avec doublons:", temoignagesGommage);

const temoignagesUniques = new Set(temoignagesGommage);
console.log("Set de témoignages uniques:", temoignagesUniques);

// Reconvertir en tableau
const preuves = [...temoignagesUniques];
console.log("Preuves sans doublons:", preuves);

// Vérifier la présence
console.log("Les preuves contiennent 90?", temoignagesUniques.has(90));
console.log("Nombre de preuves uniques:", temoignagesUniques.size);

15. OBJECT.KEYS() / VALUES() / ENTRIES()

// But: Extraire les clés, valeurs, ou paires clé-valeur d'un objet

const missionPeintresse = {
    nom: 'Expédition-33',
    cible: 'Peintresse',
    statut: 'En-cours',
    difficulté: 5,
    urgent: true
};

console.log("Mission:", missionPeintresse);
console.log("Clés mission:", Object.keys(missionPeintresse));
console.log("Détails mission:", Object.values(missionPeintresse));
console.log("Données complètes:", Object.entries(missionPeintresse));

// Rapport de mission
const rapportMission = Object.entries(missionPeintresse)
    .map(([clé, valeur]) => `${clé}: ${valeur}`)
    .join(' | ');
console.log("Rapport formaté:", rapportMission);

16. FLAT() - Aplatir les tableaux imbriqués

// But: Aplatit les tableaux imbriqués

const hierarchieLumiere = [
    ['Citoyens', 'Artisans'],
    ['Expéditionnaires', ['Gustave', 'Maelle']],
    [['Verso', 'Sciel'], 'Peintresse']
];

console.log("Hiérarchie imbriquée:", hierarchieLumiere);
console.log("Aplati niveau 1:", hierarchieLumiere.flat());
console.log("Tous les acteurs:", hierarchieLumiere.flat(2));

// Nettoyer les rangs
const rangsMélangés = [
    ['Novice', 'Apprenti'],
    [],
    ['Vétéran'],
    ['Maître', ['Légende', 'Mythe']]
];
const tousRangs = rangsMélangés.flat(2).filter(rang => rang);
console.log("Tous les rangs:", tousRangs);