Maison >interface Web >js tutoriel >Pourquoi les valeurs de retour booléennes provoquent-elles des résultats inattendus dans les fonctions de comparaison de tri de JavaScript ?

Pourquoi les valeurs de retour booléennes provoquent-elles des résultats inattendus dans les fonctions de comparaison de tri de JavaScript ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-16 19:09:21271parcourir

Why Do Boolean Return Values Cause Unexpected Results in JavaScript's Sort Comparison Functions?

Tri en JavaScript : valeurs de retour booléennes dans les fonctions de comparaison

Le problème

Malgré la pratique courante, renvoyer une valeur booléenne (vrai ou faux) dans Les fonctions de comparaison utilisées pour le tri en JavaScript sont incorrectes et peuvent conduire à des résultats inattendus.

Le Raison

Les algorithmes de tri s'attendent à ce que les fonctions de comparaison renvoient des nombres, en particulier :

  • Un nombre positif si le premier argument doit être trié après le second
  • 0 si les deux arguments sont considérés comme égaux
  • A nombre négatif si le premier argument doit être trié avant le second

Le renvoi d'une valeur booléenne (faux équivaut à 0 et vrai équivaut à 1) ne répond pas à l'exigence de transitivité pour des fonctions de comparaison cohérentes . Cette exigence garantit que l'algorithme de tri peut faire des déductions sur l'ordre des éléments sur la base de comparaisons précédentes.

Une démonstration surprenante

Considérez la fonction de comparaison :

function compare(a, b) {
    return a > b;
}

Cette la fonction renvoie vrai (ou 1) lorsque « a » est supérieur à « b » mais renvoie incorrectement faux (ou 0) même lorsque « b » est supérieur que « un ». Par conséquent, l'algorithme de tri traite « a » et « b » comme égaux, ce qui conduit à des ordres de tri imprévisibles.

Contre-exemples

Malgré la réussite de certains tests de base, la fonction de comparaison ci-dessus échoue dans certaines circonstances, tels que :

[0, 1, 0].sort(compare);  // Result: [0, 1, 0] (expected: [0, 0, 1])
[1, 1, 0, 2].sort(compare);  // Result: [0, 1, 2, 1] (expected: [0, 1, 1, 2])

Fonctions de comparaison correcte

Pour une lexicographie tri (croissant), n'utilisez aucune fonction de comparaison, car les éléments seront automatiquement convertis en chaînes à des fins de comparaison.

Pour le tri numérique, utilisez :

function compareNumbers(a, b) {
    return a - b;
}

Pour des comparaisons plus complexes, utilisez des instructions conditionnelles pour renvoyer le numéro approprié :

function compareObjects(a, b) {
    if (a.property > b.property) return 1;
    if (a.property < b.property) return -1;
    return 0;
}

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