Heim >Web-Frontend >js-Tutorial >Wie sortiert man ein Array mit Elementen, die sowohl Zeichenfolgen als auch Zahlen enthalten, in natürlicher Reihenfolge, z. B. „img12.png' und „img10.png'?

Wie sortiert man ein Array mit Elementen, die sowohl Zeichenfolgen als auch Zahlen enthalten, in natürlicher Reihenfolge, z. B. „img12.png' und „img10.png'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-16 15:53:17956Durchsuche

How do you sort an array with elements containing both strings and numbers in a natural order, like

Natürliche Sortierung von Array-Elementen mit String- und numerischen Komponenten

In einigen Fällen stoßen wir auf Arrays, die Elemente enthalten, die einem bestimmten Format folgen, z als Strings mit eingebetteten Zahlen. Solche Arrays in einer logischen Reihenfolge zu sortieren, die als „natürliche Sortierung“ bezeichnet wird, stellt eine Herausforderung dar.

Herausforderung

Stellen Sie sich ein Array wie:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]
Um das Gewünschte zu erreichen Sortierung:

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

Lösung

Natürliche Sortierung erfordert eine Vergleichsfunktion, die sowohl die numerischen als auch die Textkomponenten innerhalb jedes Elements berücksichtigt. Hier ist eine JavaScript-Implementierung:

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

Erklärung

    Die Funktion ersetzt alle Ziffern oder Nichtziffern durch ein Array von Unterarrays.
  • Die Elemente jedes Subarrays repräsentieren die numerischen und textuellen Komponenten des entsprechenden Teilzeichenfolge.
  • Die Funktion durchläuft die Unterarrays beider Zeichenfolgen und vergleicht zuerst numerische Werte und dann Textwerte.
  • Wenn ein numerischer Vergleich nicht schlüssig ist, führt die Funktion einen lexikografischen Vergleich der Textkomponenten durch .
  • Die Spanne zwischen den Längen der verbleibenden Subarrays für jede Zeichenfolge bestimmt das Natürliche Bestellung.

Beispiel

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 wäre:

Das obige ist der detaillierte Inhalt vonWie sortiert man ein Array mit Elementen, die sowohl Zeichenfolgen als auch Zahlen enthalten, in natürlicher Reihenfolge, z. B. „img12.png' und „img10.png'?. 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