Sortieren: sort()
Die Methode sort() sortiert ein Array. Anders als filter() und map() erstellt sie kein neues Array. Sie sortiert das Array selbst:
const namen = ["Leo", "Pip", "Ella", "Gina"];
namen.sort();
console.log(namen);["Ella", "Gina", "Leo", "Pip"]Bei Zahlen hält sie allerdings eine Überraschung für dich bereit:
const punkte = [10, 9, 1];
punkte.sort();
console.log(punkte);[1, 10, 9]Das liegt daran, dass sort() die Elemente als Texte vergleicht, Zeichen für Zeichen, wie Wörter in einem Wörterbuch. Der Text "10" beginnt mit "1", also kommt er vor "9". Um Zahlen zu sortieren, gib sort() eine Vergleichsfunktion:
punkte.sort((a, b) => a - b);
console.log(punkte);[1, 9, 10]sort() ruft die Vergleichsfunktion immer wieder auf, jedes Mal mit zwei der Elemente, a und b. Das Ergebnis sagt, welches von beiden zuerst kommt: Ist es negativ, kommt a zuerst; ist es positiv, kommt b zuerst; und bei 0 bleiben sie, wie sie sind. a - b ist negativ, wenn a kleiner ist, also kommen die kleineren Zahlen zuerst. Um die größte zuerst zu bekommen, vertausche sie: (a, b) => b - a.
Eine Vergleichsfunktion kann auch Objekte nach einer ihrer Eigenschaften sortieren. Texte vergleichst du mit localeCompare(): a.localeCompare(b, "de") ist negativ, wenn a im Alphabet vor b steht, und positiv, wenn es danach steht, genau wie a - b bei Zahlen. Das zweite Argument "de" legt die deutsche Sortierreihenfolge fest:
tiere.sort((a, b) => a.alter - b.alter);
console.log(tiere.map((tier) => tier.name));
tiere.sort((a, b) => a.name.localeCompare(b.name, "de"));
console.log(tiere.map((tier) => tier.name));["Pip", "Gina", "Leo", "Ella"]
["Ella", "Gina", "Leo", "Pip"]Warum benutzt man für Texte nicht einfach sort()? Es sortiert nach den Codes der Zeichen, also stehen alle Großbuchstaben vor allen Kleinbuchstaben: ["eva", "Zoe", "Anna"].sort() ergibt ["Anna", "Zoe", "eva"]. localeCompare() sortiert so, wie Menschen es tun: Anna, eva, Zoe. Und es kann Objekte sortieren, was ein einfaches sort() nicht kann.
Ein typischer Fehler ist, Texte zu subtrahieren: a.name - b.name ergibt NaN (Not a Number), und das Array bleibt in der Reihenfolge, in der es war.
So schreibst du es:
Anweisungen
- 1
Sortiere
zeitenab der schnellsten Zeit, der kleinsten Zahl, und gib das Array aus:[49, 58, 62, 71, 105]. - 2
Sortiere darunter
laeufernach ihren Zeiten, die schnellste zuerst, und gib ihre Namen in dieser Reihenfolge aus, durch Kommas getrennt:Rangliste: Mia, Liam, Zoe, Ava, Noah. - 3
Sortiere zum Schluss
laeufermitlocaleCompare()nach ihren Namen und gib die Namen in alphabetischer Reihenfolge aus:Läufer: Ava, Liam, Mia, Noah, Zoe.