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 ?
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.
Les algorithmes de tri s'attendent à ce que les fonctions de comparaison renvoient des nombres, en particulier :
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.
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.
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])
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!