Řazení: sort()
Metoda sort() pole seřadí. Na rozdíl od filter() a map() nevytváří nové pole, ale řadí přímo to původní:
const jmena = ["Toník", "Pepík", "Leo", "Žofka"];
jmena.sort();
console.log(jmena);["Leo", "Pepík", "Toník", "Žofka"]U čísel vás ale překvapí:
const body = [10, 9, 1];
body.sort();
console.log(body);[1, 10, 9]sort() totiž porovnává prvky jako texty, znak po znaku, jako slova ve slovníku. Text "10" začíná znakem "1", a proto je před "9". Když chcete řadit čísla, dejte metodě sort() porovnávací funkci:
body.sort((a, b) => a - b);
console.log(body);[1, 9, 10]sort() porovnávací funkci volá znovu a znovu, pokaždé se dvěma prvky, a a b. Podle výsledku pozná, který z nich má jít první: když je záporný, jde první a, když je kladný, jde první b, a když je 0, zůstanou, jak jsou. a - b je záporné, když je a menší, takže menší čísla půjdou dopředu. Když chcete mít největší čísla na začátku, prohoďte je: (a, b) => b - a.
Porovnávací funkce seřadí i objekty podle některé jejich vlastnosti. Texty porovnává metoda localeCompare(): a.localeCompare(b, "cs") je záporné, když je a v abecedě před b, a kladné, když je za ním, stejně jako a - b u čísel. Druhý argument, "cs", říká, že se má řadit podle české abecedy:
zvirata.sort((a, b) => a.vek - b.vek);
console.log(zvirata.map((zvire) => zvire.jmeno));
zvirata.sort((a, b) => a.jmeno.localeCompare(b.jmeno, "cs"));
console.log(zvirata.map((zvire) => zvire.jmeno));["Pepík", "Žofka", "Leo", "Toník"]
["Leo", "Pepík", "Toník", "Žofka"]Proč u textů nestačí samotné sort()? Řadí podle kódů znaků, takže všechna velká písmena dá před malá a písmena s diakritikou až za z: ["Řehoř", "Cyril", "Čeněk", "Radek"].sort() dá ["Cyril", "Radek", "Čeněk", "Řehoř"]. localeCompare() s "cs" řadí podle české abecedy: Cyril, Čeněk, Radek, Řehoř. Bez druhého argumentu se řídí jazykem, který je nastavený v prohlížeči. A s porovnávací funkcí seřadíte i objekty, což samotné sort() nedokáže.
Typická chyba je odečítat texty: a.jmeno - b.jmeno dá NaN (Not a Number, tedy „není číslo“) a pole zůstane v pořadí, v jakém bylo.
Jak psát:
Pokyny
Seřaďte casy od nejrychlejšího času, tedy od nejmenšího čísla, a pole vypište: [49, 58, 62, 71, 105].
Pod to seřaďte bezci podle času od nejrychlejšího a vypište jejich jména v tomto pořadí, oddělená čárkami: Pořadí: Adam, Cyril, Šárka, Radek, Čeněk.
Nakonec seřaďte bezci podle jména pomocí localeCompare() s argumentem "cs" a vypište jména v abecedním pořadí: Běžci: Adam, Cyril, Čeněk, Radek, Šárka.