Maison >interface Web >js tutoriel >Pourquoi une valeur de retour booléenne n'est-elle pas suffisante pour la fonction de comparaison Array.sort de JavaScript ?

Pourquoi une valeur de retour booléenne n'est-elle pas suffisante pour la fonction de comparaison Array.sort de JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-04 06:02:41138parcourir

Why Isn't a Boolean Return Value Enough for JavaScript's Array.sort Comparison Function?

Renvoyer un booléen ne devrait-il pas suffire pour une fonction de comparaison en JavaScript ?

La méthode Array.sort de JavaScript permet des fonctions de comparaison personnalisées pour trier les éléments, et une question courante se pose : une simple fonction de comparaison renvoyant un booléen peut-elle suffire pour le tri ? La réponse est non sans équivoque.

Pourquoi la comparaison booléenne est insuffisante

Une fonction de comparaison en JavaScript doit respecter les règles suivantes :

  • Renvoyer un nombre : supérieur à 0 si a doit être trié après b, 0 si égal et inférieur à 0 si a doit être trié avant b.
  • Soyez cohérent : si compare(a, b) > 0, puis comparer(b, a) < 0, et si compare(a, b) == 0, alors compare(b, a) == 0.

Cependant, renvoyer un booléen ne garantit pas la cohérence. Par exemple, si compare(a, b) renvoie false (ou de manière équivalente, 0), cela implique que a est soit égal à, soit plus petit que b. Cela viole la propriété de transitivité requise pour les algorithmes de tri.

Contre-exemple

Considérez cette fonction de comparaison :

function compare(a, b) {
  return a > b;
}<p>Elle renvoie un booléen : vrai si a est supérieur à b, et faux sinon.</p>
<p>En utilisant cette fonction en tri, nous have :</p>
<pre class="brush:php;toolbar:false">[0, 1, 0].sort(compare); // [0, 1, 0] or [1, 0, 0] (varies between implementations)
[1, 1, 0, 2].sort(compare); // [0, 1, 2, 1] or [1, 1, 0, 2] (varies between implementations)

Les résultats sont incohérents car la fonction de comparaison n'applique pas la transitivité.

Fonctions de comparaison correctes

Pour garantir un tri cohérent, utilisez des fonctions de comparaison qui renvoient le valeurs numériques correctes :

  • Tri lexicographique : Utilisez sort() sans fonction personnalisée pour un tri simple de chaînes ou de nombres.
  • Tri numérique : Utilisez (a, b) => a - b pour trier les nombres par ordre croissant.
  • Tri personnalisé : Implémentez des fonctions de comparaison qui suivent les règles décrites ci-dessus, en tenant compte des propriétés spécifiques que vous souhaitez trier.

En suivant ces directives, vous pouvez garantir un comportement de tri fiable et prévisible dans votre code JavaScript.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn