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

Comment trier des tableaux avec des chaînes contenant des nombres dans l'ordre naturel ?

Barbara Streisand
Libérer: 2024-11-17 19:18:01
original
471 Les gens l'ont consulté

How to Sort Arrays with Strings Containing Numbers in Natural Order?

Tri naturel des éléments d'un tableau : chaînes avec des nombres

Cet article approfondit la tâche de tri des tableaux contenant des éléments qui combinent des chaînes et des nombres dans un ordre naturel, où les séquences numériques dans les chaînes doivent être prises en compte dans le processus de tri.

Le Problème

Considérons un tableau comme celui-ci :

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

Si nous essayons de trier ce tableau à l'aide d'une fonction de tri conventionnelle, nous pouvons nous retrouver avec un ordre incorrect :

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

La solution : le tri naturel

Pour réaliser un tri naturel, nous pouvons exploiter le JavaScript suivant function :

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 tokenise les chaînes d'entrée en tableaux de valeurs numériques et non numériques. Il compare ensuite les tableaux lexicographiquement, en prenant en compte les valeurs numériques sous forme d'entiers et les valeurs non numériques sous forme de chaînes.

Exemple

Application de cette fonction au tableau donné aboutit à l'ordre de tri naturel souhaité :

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)
document.write("<pre class="brush:php;toolbar:false">" + JSON.stringify(test,0,3));
Copier après la connexion

Cela produit les éléments triés suivants tableau :

[
  "",
  "abc",
  "abc2",
  "abc10",
  "abc10.jpg",
  "20",
  "20.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