Maison  >  Article  >  interface Web  >  Comment implémenter un algorithme de tri naturel en JavaScript pour les tableaux contenant des éléments alphanumériques mixtes ?

Comment implémenter un algorithme de tri naturel en JavaScript pour les tableaux contenant des éléments alphanumériques mixtes ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-09 16:06:02970parcourir

How do you implement a natural sort algorithm in JavaScript for arrays containing mixed alphanumeric elements?

Tri naturel des éléments du tableau avec des nombres et des alphabets

Déterminer l'ordre des éléments du tableau contenant des valeurs numériques et des caractères alphabétiques peut être difficile. Un tri naturel est nécessaire pour gérer ce scénario, qui organise les éléments en fonction de leurs vraies valeurs.

Échantillon de tableau et résultat souhaité

Considérez le tableau d'entrée suivant :

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]

L'ordre de tri souhaité est :

["IL0 Foo", "IL3 Bob says hello", "IL10 Baz", "PI0 Bar"]

Tri naïf Approche

Une fonction de comparaison simple, comme celle fournie, trie les éléments uniquement selon la partie initiale (2 lettres) et ignore la partie numérique :

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

Implémentation du tri naturel en JavaScript

Pour réaliser un tri naturel, la fonction suivante peut être utilisé :

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d+)|(\D+)/g, function(_, , ) { ax.push([ || Infinity,  || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, , ) { bx.push([ || Infinity,  || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}

Cette fonction divise chaque élément en un tableau de paires, où le premier élément est un nombre (ou l'infini s'il n'y a pas de nombre) et le deuxième élément est une chaîne :

["IL0 Foo"] -> [["0", "IL"], ["Foo", ""]]
["PI0 Bar"] -> [["0", "PI"], ["Bar", ""]]

La logique de comparaison compare ensuite les paires une à une en privilégiant les valeurs numériques. Si les valeurs numériques sont égales, les chaînes sont comparées à l'aide de localeCompare.

Exemple d'utilisation et résultat

Tri de l'échantillon de tableau à l'aide de la fonction naturalCompare :

test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)

Le tableau trié sera :

["", "20", "20.jpg", "abc", "abc2", "abc2.jpg", "abc10", "abc10.jpg", "img1.png", "img2.png", "img10.png", "img12.png", "img101.png", "img101a.png"]

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