Heim >Web-Frontend >js-Tutorial >Wie sortiere ich Arrays mit Zeichenfolgen, die Zahlen in natürlicher Reihenfolge enthalten?

Wie sortiere ich Arrays mit Zeichenfolgen, die Zahlen in natürlicher Reihenfolge enthalten?

Barbara Streisand
Barbara StreisandOriginal
2024-11-17 19:18:01574Durchsuche

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

Natürliche Array-Elementsortierung: Zeichenfolgen mit Zahlen

Dieser Artikel befasst sich mit der Aufgabe, Arrays zu sortieren, die Elemente enthalten, die Zeichenfolgen und Zahlen in einem kombinieren natürliche Reihenfolge, bei der numerische Sequenzen innerhalb der Zeichenfolgen beim Sortierprozess berücksichtigt werden sollten.

Das Problem

Stellen Sie sich ein Array wie dieses vor:

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

Wenn wir versuchen, dieses Array mit einer herkömmlichen Sortierfunktion zu sortieren, erhalten wir möglicherweise eine falsche Reihenfolge:

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

Die Lösung: Natürliche Sortierung

Um eine natürliche Sortierung zu erreichen, können wir die folgende JavaScript-Funktion nutzen:

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 tokenisiert die Eingabezeichenfolgen in Arrays numerischer und nicht numerischer Werte. Anschließend werden die Arrays lexikografisch verglichen, wobei die numerischen Werte als Ganzzahlen und die nicht numerischen Werte als Zeichenfolgen berücksichtigt werden.

Beispiel

Anwenden dieser Funktion auf das angegebene Array ergibt die gewünschte natürliche Sortierreihenfolge:

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

Dies erzeugt das folgende sortierte Array:

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

Das obige ist der detaillierte Inhalt vonWie sortiere ich Arrays mit Zeichenfolgen, die Zahlen in natürlicher Reihenfolge 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