Javascript array sort(), reverse()

Array alphabetisch sortieren mit sort , numerische Sortierung

array.sort () sortiert Array alphabetisch oder numerisch, aufsteigend oder absteigend.

sort () sortiert die Elemente eines Arrays in lexikalischer Folge, wobei 30 vor 4 rangiert und 4 auf dem Index 5 liegt.

Das Sortieren von Zahlen oder Strings gehört in das Standardrepertoire jedes Programmierers. Dabei sollen Abläufe mit wiederholtem Verschieben von Elementen immer vermieden werden. Wenn nur Indizies oder Zeiger verändert werden, funktioniert das Sortieren viel viel schneller.

Da Javascript durch und durch objektorientiert ist, resultieren die Verschiebe-Operationen beim Sortieren im Umhängen von Zeigern und bewegen keine großen Datenmengen.

Javascript Arrays haben bereits ein effizientes array.sort () eingebaut. Ohne weiteren Parameter werden die Elemente des Arrays in Strings konvertiert und miteinander verglichen.

let simpleNames = ['schmitz', 'Meier', 'Schulze', 'Ämter', 'amtsmann', '17demut', '7demut', 'Liedermacher', 'wiedemeier'];
simpleNames.sort();

… und so sieht das sortierte Array anschließend aus:

sort() ändert den Inhalt des Arrays.

sort() ist case-sensitiv, also abhängig von Groß- und Kleinschreibung und sortiert in alphabetischer Reihenfolge – Javascript sort() agiert auf Unicode. Um Strings ohne Rücksicht auf Groß- und Kleinschreibung alphabetisch zu sortieren, bringt eine CompareFunction alles auf einen Nenner.

simpleNames.sort(function (l,u) {
    return l.toLowerCase().localeCompare(u.toLowerCase());
});

Zahlen und Boolean sortieren

Javascript wandelt Zahlen in Zeichenketten um, so dass 17 vor 7 rangiert. Um numerische Werte zu sortieren, muss eine Funktion erzeugt und übergeben werden, die Zahlen vergleicht.

let arrnum = [17, 511, 7, 1024, 4711, 0, -18, -8];
arrnum.sort(function(a,b) {
    return a - b;
});

Und die Konsole zeigt



let colors = new Array("rote Haare", "Grünton", "gelb", "Oliv", "Grauzone");
let numbers = new Array (600, 204, 13, 2.4, 7, -15,3, -2.3e3);
let bool = new Array (true, false, true, true, false);
let mixed = new Array (100, "King Kong", 205, true);
colors.sort();
bool.sort();
mixed.sort();
numbers.sort();
	
console.log(colors + "\n" + bool + "\n" + mixed + "\n" + numbers);


Aufsteigend, absteigend sortieren

Wenn eine andere Sortierfunktion gefordert ist, kann eine Funktion als Argument übergeben werden. Diese Funktion soll zwei Werte vergleichen und einen Wert zurückgeben, der die Sortierreihenfolge vorgibt:

  • -1, wenn das erste Element vor dem folgenden stehen soll,
  • 1, wenn das zweite Element vor dem ersten rangieren soll,
  • 0, wenn die beiden Elemente gleich sind und in beliebiger Folge stehen können.

Um Zahlen zu vergleichen, subtrahiert die Vergleichsfunktion nur die zweite von der ersten Zahl:

let numbers = new Array (600, 204, 13, 2.4, 7, -15,3, -2.3e3);
function numSort(a, b) { 
   return (a - b);
} 
numbers.sort(numSort);
console.log(numbers);              // Ausgabe -2300,-15,2.4,3,7,13,204,600


Nach Stringlänge sortieren

let trees = new Array("Kokospalme", "Rotbuch", "Tanne", "Birke", "Ahornbaum");

function len(a, b) {
   let sort = (a.length < b.length) ? -1 : (b.length < a.length) ? 1 : 0;
   return sort;
}

trees.sort(len);
alert(trees);              // Ausgabe: Tanne,Birke,Rotbuch,Ahornbaum,Kokospalme

Die Funktion len(a, b) vergleicht die Länge zweier Strings und gibt -1 zurück, wenn a länger als b ist, 1, wenn b länger als a ist und 0 sonst. trees.sort(len) sortiert das Array trees nach der Länge der Strings.


Mehrdimensionale Arrays sortieren

Wenn a und b selber Arrays sind, erzeugt ein mathematischer Vergleich nicht die gewünschten Ergebnisse. Wir müssen ihre inneren Werte vergleichen und sie dann nach einem Kriterium sortieren. Alle anderen Werte des Arrays werden also zu Beiwerk degradiert.

let poi = [
    [17, "Amanda Saubermann"],
    [3, "Jonas vom Berge"],
    [90, "Zephir der Kluge"],
    [121, "Sturmhöhe"]];
    
poi.sort(function(a, b){
    return a[0] - b[0];
});

console.log (poi);

Liefert

[3, "Jonas vom Berge"]
[17, "Amanda Saubermann"]
[90, "Zephir der Kluge"]
[121, "Sturmhöhe"]

IP-Adressen mit Javascript sortieren

IP-Adressen muss man in Javascript nicht als mehrdimensionales Array sorteren. IP V4-Adressen sind lange Zahlen, die zur besseren Lesbarkeit in vier Blöcke unterteilt sind.

let ips = [
   "2.180.163.67",
   "121.199.77.90",
   "173.230.94.216",
   "190.42.1.208",
   "173.230.95.216",
   "154.120.226.126",…];

function dot2num2(dot) {
   let d = dot.split('.');
   return ((((((+d[0]) * 256) + (+d[1])) * 256) + (+d[2])) * 256) + (+d[3]);
}

ips.sort(
   function( a, b ){
      return dot2num2(a) - dot2num2(b);
   }
);



Es gibt auch eine ebenso einfach Javascript-Funktion, die eine Zahl in eine IP-Adresse umwandelt. Sie wird hier allerdings nicht gebraucht.

function num2dot1(num) {
   let part1 = num & 255;
   let part2 = ((num >> 8) & 255);
   let part3 = ((num >> 16) & 255);
   let part4 = ((num >> 24) & 255);
   return part4 + "." + part3 + "." + part2 + "." + part1;
}

Quelle: IP-Adressen in Dezimalzahl und zurück ipaddress to decimal and back

array.reverse() – Array umdrehen

Javascript reverse kehrt die Reihenfolge der Elemente in einem Array um.

let days = new Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag");
days.reverse();
	
alert(days);               // AusgabeFreitag,Donnerstag,Mittwoch,Dienstag,Montag

Der Aufruf days.reverse(); kehrt die Reihenfolge der Arrayelemente um, so dass das letzte Element zum ersten Element wird.



let trees = new Array("Kokospalme", "Rotbuch", "Tanne", "Birke");
let len = trees.unshift("Weide", "Pappel");
alert("trees " + trees + " len " + len);

let len = trees.unshift("Weide", "Pappel"); fügt die Elemente mit dem Wert "Weide" und "Pappel" am Anfang des Arrays trees ein und speichert die neue Anzahl der Arrayelement in der Variablen len.


array.valueOf()

Arrays in Javascript erben die Methode valueOf vom Objekt Object. valueOf gibt einen primitiven Wert für das angegebene Array zurück. Überschreibt die Methode Object.valueOf().
Syntax: Array.valueOf()