Maison > interface Web > js tutoriel > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-09 16:06:02
original
973 Les gens l'ont consulté

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"]
Copier après la connexion

L'ordre de tri souhaité est :

["IL0 Foo", "IL3 Bob says hello", "IL10 Baz", "PI0 Bar"]
Copier après la connexion

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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", ""]]
Copier après la connexion

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)
Copier après la connexion

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"]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal