Introduction
Les Map en JavaScript sont des structures de données puissantes qui permettent de stocker des paires clé-valeur. Contrairement aux objets classiques, les Maps préservent l'ordre d'insertion et peuvent utiliser n'importe quel type comme clé. Cependant, contrairement aux tableaux, les Maps ne disposent pas d'une méthode sort() intégrée. Dans cet article, nous allons explorer différentes techniques pour trier un Map en JavaScript, que ce soit par ses clés ou par ses valeurs.
Trier un Map par clés
La méthode la plus courante pour trier un Map par ses clés consiste à convertir le Map en tableau, le trier, puis créer un nouveau Map. Voici comment procéder :
const monMap = new Map([
['banane', 3],
['pomme', 5],
['cerise', 1],
['datte', 2]
]);
const trieParCles = new Map(
[...monMap.entries()].sort((a, b) => a[0].localeCompare(b[0]))
);
console.log(trieParCles);
Explication
L'opérateur de décomposition [...monMap.entries()] convertit les entrées du Map en un tableau de paires [clé, valeur]. Nous trions ensuite ce tableau à l'aide de sort() avec une fonction de comparaison utilisant localeCompare() pour un tri alphabétique correct (qui prend en compte les accents et les caractères spéciaux), puis nous créons un nouveau Map à partir du tableau trié.
Trier un Map par valeurs
Pour trier par valeurs plutôt que par clés, nous modifions simplement la fonction de comparaison :
const trieParValeurs = new Map(
[...monMap.entries()].sort((a, b) => a[1] - b[1])
);
console.log(trieParValeurs);
const trieParValeursDesc = new Map(
[...monMap.entries()].sort((a, b) => b[1] - a[1])
);
console.log(trieParValeursDesc);
Créer une fonction réutilisable
Pour une meilleure organisation du code, vous pouvez créer une fonction utilitaire :
function trierMap(map, triPar = 'cle', ordre = 'croissant') {
const entrees = [...map.entries()];
const comparer = (a, b) => {
const aVal = triPar === 'cle' ? a[0] : a[1];
const bVal = triPar === 'cle' ? b[0] : b[1];
if (typeof aVal === 'number' && typeof bVal === 'number') {
return ordre === 'croissant' ? aVal - bVal : bVal - aVal;
}
if (typeof aVal === 'string' && typeof bVal === 'string') {
const resultat = aVal.localeCompare(bVal);
return ordre === 'croissant' ? resultat : -resultat;
}
if (ordre === 'croissant') {
return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
} else {
return aVal > bVal ? -1 : aVal < bVal ? 1 : 0;
}
};
return new Map(entrees.sort(comparer));
}
const trie1 = trierMap(monMap, 'cle', 'croissant');
const trie2 = trierMap(monMap, 'valeur', 'decroissant');
Cas d'usage pratiques
Voici quelques exemples concrets où le tri de Map est utile :
Trier des statistiques par valeur (scores, votes, etc.)
Organiser des données par ordre alphabétique de clés
Créer des classements ou des top listes
const scores = new Map([
['Alice', 95],
['Bob', 87],
['Charlie', 92],
['Diana', 88]
]);
const classement = new Map(
[...scores.entries()].sort((a, b) => b[1] - a[1])
);
console.log(classement);
Le tri d'un Map a une complexité temporelle de O(n log n) due à l'algorithme de tri. Pour de grandes quantités de données, considérez :
Mettre en cache les résultats triés si le Map ne change pas fréquemment
Utiliser une structure de données différente si le tri est une opération très fréquente
Évaluer paresseusement (lazy evaluation) pour de très grands datasets
Astuce : Si vous devez trier fréquemment, envisagez d'utiliser un tableau trié ou une structure de données spécialisée comme un SortedMap (disponible dans certaines bibliothèques).
Conclusion
Nous avons couvert les aspects essentiels du tri de Map en JavaScript. Bien que les Maps n'aient pas de méthode sort() intégrée, il est facile de les trier en les convertissant en tableaux. La pratique et l'expérimentation vous aideront à maîtriser ces concepts et à les appliquer efficacement dans vos projets.
N'hésitez pas à adapter ces exemples à vos besoins spécifiques et à explorer d'autres techniques de tri selon vos cas d'usage !