Fonctions de comparaison personnalisées pour le tri de tableaux en JavaScript : lorsque les retours booléens ne suffisent pas
Alors que les fonctions de comparaison personnalisées sont souvent utilisées pour modifier l'ordre lexicographique par défaut des tableaux, une idée fausse courante est que le simple fait de renvoyer vrai ou faux à partir de la fonction est suffisant. Cependant, cette approche est incorrecte et peut conduire à des résultats de tri peu fiables.
Problèmes liés aux fonctions de comparaison booléennes
Le problème lié au renvoi d'un booléen à partir d'une fonction de comparaison est qu'il peut violer les exigences d'une « fonction de comparaison cohérente » telle que définie dans la spécification JavaScript. Les fonctions de comparaison cohérentes doivent renvoyer un nombre (en particulier -1, 0 ou 1) indiquant l'ordre relatif des éléments comparés.
Le retour d'un booléen au lieu d'un nombre peut entraîner un comportement inattendu :
-
Violation de transitivité : La fonction function(a, b) { return a > b; } renvoie false lorsque b est supérieur à a, ce qui implique que b doit être trié avant a. Cependant, la fonction renvoie également false lorsque a et b sont égaux, ce qui contredit la propriété transitive qui stipule que si a est égal à b et b est inférieur à c, alors a doit être inférieur à c.
-
Ordre de tri non défini : Le retour de false à partir de la fonction de comparaison peut conduire à un ordre de tri non défini. Par exemple, le tri [1, 1, 0, 2].sort(function(a, b) { return a > b; }) pourrait donner lieu à [0, 1, 1, 2] ou [1, 1, 0, 2] selon la mise en œuvre de l'algorithme de tri.
Comparaison correcte Fonctions
Pour garantir un tri cohérent et fiable, il est crucial de définir des fonctions de comparaison qui renvoient un nombre représentant l'ordre relatif des éléments comparés :
-
Fonction de comparaison générique : Pour une comparaison lexicographique, une fonction générique peut être définie comme function(a, b) { if (a < b) return -1 ; si (a > b) renvoie 1 ; sinon, renvoie 0 ; }.
-
Comparaison de nombres : Pour comparer des nombres, une fonction plus simple peut être utilisée : function(a, b) { return a - b; }.
-
Comparaison par propriétés spécifiques : Pour trier des objets ou des tableaux selon une propriété spécifique, la fonction peut accéder à cette propriété et comparer ses valeurs : function(a, b) { return a. nom.localeCompare(b.name); } pour trier par noms d'objets.
Conclusion
Bien qu'il puisse être tentant d'utiliser des retours booléens pour les fonctions de comparaison en JavaScript, il est essentiel de suivre les exigences spécifiées pour des fonctions de comparaison cohérentes. Cela garantit que les algorithmes de tri peuvent comparer correctement les éléments et produire des résultats fiables et prévisibles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!