Sortieren ein Array von Ganzzahlen in JavaScript

Pablo Felipe 12 Oktober 2023
  1. Sortieren Sie ein Array von Ganzzahlen in JavaScript mit der .sort-Methode
  2. Übergeben einer Vergleichsfunktion als Parameter
  3. Sortieren ein Array von Ganzzahlen in JavaScript mit der Pfeilfunktion
Sortieren ein Array von Ganzzahlen in JavaScript

Dieses Tutorial stellt die Methode .sort vor, die zum Sortieren eines Arrays nach einer bestimmten Reihenfolge verwendet werden kann, und erklärt, warum diese Methode eine Vergleichsfunktion benötigt, wenn Sie ein Array aus ganzen Zahlen korrekt sortieren möchten.

Diese Vergleichsfunktion bestimmt die Sortierreihenfolge. Außerdem erklären wir, wie man es verwendet, um eine Sortierung in absteigender Reihenfolge vorzunehmen, sowie eine kürzere Möglichkeit, alles zusammen zu verwenden, indem man die Vergleichsfunktion als Pfeilfunktion innerhalb der Methode .sort verwendet.

Sortieren Sie ein Array von Ganzzahlen in JavaScript mit der .sort-Methode

Die Methode .sort ist eine Methode der Entität Array, die ein geordnetes Array aus dem Array zurückgibt, das diese Methode ursprünglich aufgerufen hat. Beispielsweise:

// Input
let array = [10, 10000, 1000, 100, 1]
console.log(array.sort())

Ausgabe:

// Output
[ 1, 10, 100, 1000, 10000 ]

Sicher, dies wird erwartet, da die Methode .sort das Array ordnet. Aber, wenn wir die folgende Eingabe haben:

// Input
let array = [12900, 877, 12, 992, 10000]
console.log(array.sort())

Wir haben eine falsche Reihenfolge wie folgt:

// Output
[10000, 12, 12900, 877, 992]

Dies liegt daran, dass die Standardreihenfolge von .sort auf dem UTF-16 oder 16-Bit Unit Transformation Format basiert, das eine Codierung des Unicode-Musters ist. Die Methode konvertiert die Array-Werte in den String-Typ und ordnet dann ihre Unicode-Werte.

Mit dieser Erklärung kann die Methode .sort auch verwendet werden, um andere Datentypen zu ordnen, nicht nur Zahlen.

Aber wie kann die Methode .sort verwendet werden, um ein Array richtig zu ordnen? Ganz einfach: mit einer Vergleichsfunktion.

Übergeben einer Vergleichsfunktion als Parameter

Da die Methode .sort ohne Parameter verwendet werden kann, ist eine Vergleichsfunktion optional. Grundsätzlich definiert diese Funktion die Reihenfolge der Methode .sort, und diese Funktion empfängt zwei Parameter: das erste zu vergleichende Element und das zweite zu vergleichende Element.

Die .sort-Methode wird:

  • Setzen Sie first nach second, wenn die compareFunction einen Wert grösser als 0 zurückgibt;
  • Setzen Sie first vor second, wenn die compareFunction einen Wert kleiner als 0 zurückgibt;
  • Nichts tun, wenn die compareFunction einen Wert gleich 0 zurückgibt.

Mit der compareFunction(first, second) können wir also die Reihenfolge der Sortierung bestimmen, indem wir eine Operation zwischen den Parametern first und second übergeben. Zu aufsteigender Reihenfolge,

// Ascending ordering
function compareFunction(first, second) {
  if (first > second)
    return 1  // 1 is greater than 0, so .sort will put first after second.
    if (first < second) return -1  // -1 is less than 0, so .sort will put first
                                   // before second.
    return 0
}

Und für absteigende Reihenfolge können wir die Operatoren umkehren.

// Descending ordering
function compareFunction(first, second) {
  if (first < second)
    return 1  // 1 is greater than 0, so .sort will put first after second.
    if (first > second) return -1  // -1 is less than 0, so .sort will put first
                                   // before second.
    return 0
}

Wenn wir nun compareFunction für aufsteigende Sortierung zusammen mit der .sort-Methode einsetzen, haben wir schließlich:

// Input:
let array = [12900, 877, 12, 992, 10000]
// Ascending
array.sort(function compareFunction(first, second) {
  if (first > second)
    return 1  // 1 is greater than 0, so .sort will put first before second.
    if (first < second) return -1  // -1 is less than 0, so .sort will put first
                                   // after second.
    return 0
})
console.log(array)

Ausgabe:

// Output:
[ 12, 877, 992, 10000, 12900 ]

Sortieren ein Array von Ganzzahlen in JavaScript mit der Pfeilfunktion

Wir können auch den gesamten Codeblock auf eine minimale Syntax reduzieren, indem wir Arrow-Funktionen verwenden.

Eine Pfeilfunktion ist eine weitere Möglichkeit, eine Funktion mit kürzerer Syntax zu verwenden. Pfeilfunktionen sind anonyme Funktionen, und das bedeutet, dass sie nicht benannt sind (in Variablen gespeichert oder als Funktionsparameter übergeben werden) und nicht in allen Situationen verwendet werden können.

Mit der Struktur einer Pfeilfunktion können die traditionellen Funktionen in einen kürzeren Block umgewandelt werden, wie das Beispiel zeigt:

// Common anonymous function
function(x) {
  return x + 1;
}

// Arrow function
(x) => x + 1

Außerdem kann die Struktur einer Pfeilfunktion automatisch den Ausdruckswert ohne das reservierte Wort return zurückgeben:

// Arrow function
let arrowFunction = (x) => x + 1
console.log(arrowFunction(1))

Ausgabe:

//Output
2

Die console.log() gibt den Wert 1 + 1 aus, also 2, obwohl die arrowFunction die return-Anweisung nicht verwendet. Es wird uns im nächsten Schritt helfen.

Wie gesagt, die .sort-Methode kann eine Vergleichsfunktion enthalten, und diese Funktion kann eine Pfeilfunktion sein. Durch Konvertieren der vorherigen Vergleichsfunktionsstruktur können wir den gesamten Codeblock wie folgt in einen kürzeren Block umwandeln:

// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => {
  if (first > second) return 1
    return -1
})
// Ascending: If first > second == true, then change one by the other.
console.log(array)

Wir können die Bedingung auf first < second fallen lassen und stattdessen einen -1-Wert als Standardwert zurückgeben, wenn die primäre Bedingung nicht der Fall ist; Da der Wert 0 für die Methode .sort gleich ist, können sie ihre Position ändern, ohne das Endergebnis zu beeinflussen. Auf diese Weise können wir noch mehr reduzieren, wie im folgenden Beispiel:

// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first > second ? 1 : -1)
// Ascending: If first > second == true, then change one by the other.
console.log(array)

Sehen Sie, dass der vorherige >-Vergleich und die Voreinstellung Zurück in nur einen Vergleich geändert wurden: first > second ? 1 : -1. Das bedeutet, dass, wenn der Vergleich true ist, 1 zurückgegeben wird; wenn nicht, gibt es -1 zurück.

Wir brauchen die ? ternärer Operator, weil der Vergleich first > second nur true oder false ergibt. Aber wie gesagt, die Methode .sort erwartet 1, -1 oder 0.

Ausgabe:

// Output:
[ 1, 10, 100, 1000, 10000 ]

Und für absteigende Reihenfolge:

// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first < second ? 1 : -1)
// Descending: If first < second == true, then change one by the other.
console.log(array)

Ausgabe:

// Output:
[ 10000, 1000, 100, 10, 1 ]

Eine andere Möglichkeit, dasselbe zu tun, ist die Verwendung des ternären Operators - für die Subtraktion. Wenn wir array.sort((first, second) => first > second ? 1 : -1) verwenden und first - second einen Wert grösser als 0 ergeben, dann ändert sich ein Index untereinander. Wenn first - second einen Wert kleiner als 0 ergibt, passiert nichts, und bei gleichen Werten gibt der Vergleich 0 zurück.

Beispiel:

// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => first - second))

Ausgabe:

// Output:
[ 1, 10, 100, 1000, 10000 ]

Was können wir in absteigender Reihenfolge tun? Nein, es ändert nicht den ternären Operator - in +, da jede positive Zahl plus eine weitere positive Zahl einen Wert größer als 0 ergibt. Aber wir haben eine einfache Lösung dafür: Invertieren Sie first > second in second - first.

Wenn also second – first einen Wert grösser als 0 ergibt, tauscht die .sort-Methode ihre Positionen untereinander aus.

Beispiel:

// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => second - first))

Ausgabe:

// Output:
[ 10000, 1000, 100, 10, 1 ]

Verwandter Artikel - JavaScript Array