web-dev-qa-db-fra.com

Une manière optimale de comparer les chaînes en JavaScript?

J'essaie d'optimiser une fonction qui effectue une recherche binaire de chaînes en JavaScript.

La recherche binaire nécessite que vous sachiez si la clé est == le pivot ou < le pivot.

Mais cela nécessite deux comparaisons de chaînes en JavaScript, contrairement à C comme les langages qui ont la fonction strcmp() qui renvoie trois valeurs (-1, 0, +1) pour (inférieur à, égal, supérieur à).

Existe-t-il une telle fonction native en JavaScript, qui peut renvoyer une valeur ternaire de sorte qu’une seule comparaison est requise à chaque itération de la recherche binaire?

369
HRJ

Vous pouvez utiliser la méthode localeCompare().

string_a.localeCompare(string_b);

/* Expected Returns:

 0:  exact match

-1:  string_a < string_b

 1:  string_a > string_b

 */

Lectures complémentaires:

496
Daniel Vassallo

Eh bien en JavaScript, vous pouvez vérifier que la valeur de deux chaînes est identique à celle des entiers afin que vous puissiez le faire:

  • "A" < "B"
  • "A" == "B"
  • "A" > "B"

Et par conséquent, vous pouvez créer votre propre fonction qui vérifie les chaînes de la même manière que le strcmp().

Donc, ce serait la fonction qui fait la même chose:

function strcmp(a, b)
{   
    return (a<b?-1:(a>b?1:0));  
}
53
Cipi

Vous pouvez tilisez les opérateurs de comparaison pour comparer les chaînes . Une fonction strcmp pourrait être définie comme ceci:

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

Edit Voici une fonction de comparaison de chaînes prenant au plus min {longueur ( a ), longueur ( b )} comparaisons pour indiquer le lien entre deux chaînes:

function strcmp(a, b) {
    a = a.toString(), b = b.toString();
    for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i);
    if (i === n) return 0;
    return a.charAt(i) > b.charAt(i) ? -1 : 1;
}
12
Gumbo