Heim  >  Artikel  >  Web-Frontend  >  Wie implementiert man in JavaScript einen natürlichen Sortieralgorithmus für Arrays, die gemischte alphanumerische Elemente enthalten?

Wie implementiert man in JavaScript einen natürlichen Sortieralgorithmus für Arrays, die gemischte alphanumerische Elemente enthalten?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 16:06:02938Durchsuche

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

Natürliche Sortierung von Array-Elementen mit Zahlen und Alphabeten

Die Bestimmung der Reihenfolge von Array-Elementen, die numerische Werte und alphabetische Zeichen enthalten, kann eine Herausforderung sein. Um dieses Szenario zu bewältigen, ist eine natürliche Sortierung erforderlich, die Elemente basierend auf ihren wahren Werten anordnet.

Beispielarray und gewünschtes Ergebnis

Betrachten Sie das folgende Eingabearray:

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

Die gewünschte Sortierreihenfolge ist:

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

Naiver Sortieransatz

Eine einfache Vergleichsfunktion, wie die bereitgestellte, sortiert die Elemente nur nach dem Anfangsteil (2 Buchstaben) und ignoriert den numerischen Teil:

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

Natürliche Sortierimplementierung in JavaScript

Um eine natürliche Sortierung zu erreichen, gehen Sie wie folgt vor Funktion kann verwendet werden:

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;
}

Diese Funktion teilt jedes Element in ein Array von Paaren auf, wobei das erste Element eine Zahl (oder Unendlich, wenn keine Zahl) und das zweite Element eine Zeichenfolge ist:

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

Die Vergleichslogik vergleicht dann die Paare einzeln, wobei numerischen Werten Vorrang eingeräumt wird. Wenn die numerischen Werte gleich sind, werden die Zeichenfolgen mit localeCompare verglichen.

Beispielverwendung und Ergebnis

Sortieren des Beispielarrays mit der naturalCompare-Funktion:

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)

Das sortierte Array ist:

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

Das obige ist der detaillierte Inhalt vonWie implementiert man in JavaScript einen natürlichen Sortieralgorithmus für Arrays, die gemischte alphanumerische Elemente enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn