Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

10. diel - Poľa v JavaScripte druhýkrát - Radenie prvkov a 2D poľa Nové

V tutoriále základov JavaScriptu sa budeme venovať ďalšej práci s poľom. Ukážeme si, ako prvky poľa zoradiť. Predstavíme si tiež pole polí, teda dvojrozmerné pole. Využijeme ho pri tvorbe aplikácie, ktorá bude mať za úlohu zistiť, kto má daný deň v roku sviatok.

Radenie prvkov v poli

Položky v poli je možné jednoducho zoradiť metódou sort(). Táto metóda nám zoradí textové reťazce podľa abecedy (vzostupne):

let jmena = ["Dan", "Bohouš", "Cyril", "Anna"];
jmena.sort();
for (let jmeno of jmena) {
    document.write(jmeno + " ");
}

Výstup v prehliadači:

Poľa v JavaScripte
localhost

Poradie prvkov v poli môžeme otočiť pomocou metódy reverse(). Do predchádzajúceho príkladu teda pridáme volanie tejto metódy a cyklus na výpi prvkov poľa:

jmena.reverse();
for (let jmeno of jmena) {
    document.write(jmeno + " ");
}

Výstup v prehliadači:

Poľa v JavaScripte
localhost

Pokiaľ máme v poli čísla, metóda sort() ich zoradí ako textové reťazce:

let cisla = [5, 3, 30, 25];
cisla.sort();
for (let cislo of cisla) {
    document.write(cislo + " ");
}

Výstup:

Poľa v JavaScripte
localhost

Tento výpis je ale správne iba lexikograficky, nie tak, ako sme mali v úmysle. Aby sme docielili správny výsledok, musíme metóde pridať anonymnú funkciu, v ktorej určíme, podľa čoho má prvky nášho poľa porovnať. Použijeme teda nasledujúci zápis:

let cisla = [5, 3, 30, 25];
cisla.sort(function(a, b) { return a - b });
for (let cislo of cisla) {
    document.write(cislo + " ");
}

V prehliadači si môžeme overiť, že sú čísla už zoradené správne:

Poľa v JavaScripte
localhost

Funkciám sa budeme venovať v lekcii Funkcie v JavaScripte. Jednoducho povedané tu metóde sort() určíme, že má zistiť rozdiel medzi dvoma prvkami (a - b). Pretože sa tieto prvky pokúšame odčítať, dôjde k ich pretypovaniu z reťazca na číslo. Ak je a väčšia ako b, získame kladnú hodnotu a metóda tieto čísla prehodí. V opačnom prípade zostane poradie zachované. Porovnávanie položiek v poli prebieha opakovane až do chvíle, kedy sú všetky prvky poľa na správnych pozíciách a pole je celé zoradené.

Dvojrozmerné pole v JavaScripte

Mnohých z nás asi neprekvapí, že JavaScript umožňuje vytvoriť aj pole, ktoré obsahuje ďalšie pole ako svoje prvky. Hovoríme potom o poli polí alebo o dvojrozmernom poli.

Dvojrozmerné pole si môžeme v pamäti predstaviť ako tabuľku a mohli by sme takto reprezentovať napr. rozohranú partiu piškvoriek. Ak by sme sa chceli držať reálnych aplikácií, môžeme si predstaviť, že do 2D poľa budeme ukladať informácie o obsadenostiach sedadiel v kinosále. Situáciu by sme si mohli graficky znázorniť napr. takto:

Štruktúra dvojrozmerného poľa v Jave - Základné konštrukcie jazyka JavaScript - Základné konštrukcie jazyka JavaScript

(Na obrázku je vidieť 2D pole reprezentujúce obsadenosť kinosály)

Kinosála by bola v praxi samozrejme väčšia, ale ako ukážka nám toto pole postačí. 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 pre rezervované a podobne.

Viacrozmerné polia využijeme najmä, ak programujeme nejakú simuláciu, napríklad hru.

Deklarácia 2D poľa

Aby sme vytvorili pole polí, najskôr si deklarujeme pole s názvom kinosal. Do toho potom pomocou cyklu vložíme nové polia (kinosal[i] = [];), ktorého položky potom pomocou vnoreného cyklu napĺňame dátami. Definícia takého poľa pre kinosálu, ktorá by na začiatku obsahovala samé 0, vyzerá takto:

let kinosal = [];

for (let i = 0; i < 5; i++) {
    kinosal[i] = [];
    for (let j = 0; j < 5; j++) {
        kinosal[i][j] = 0; // Naplnenie poľa nulami
    }
}

Prvý cyklus udáva počet stĺpcov, druhý cyklus udáva počet riadkov (samozrejme si to môžeme určiť aj obrátene, napr. matice v matematike sa zapisujú opačne).

Naplnenie dátami

Teraz kinosálu naplníme jednotkami tak, ako je vidieť na obrázku vyššie. Pre prístup k prvku 2D poľa musíme samozrejme zadať dve súradnice pomocou indexov. Prostredný prvok nášho kinosály je teda na pozícii kinosal[2][2]. Predošlý kód doplníme takto:

kinosal[2][2] = 1;

// Úprava 4. riadku
for (let i = 1; i < 4; i++) {
    kinosal[3][i] = 1;
}

// Naplnenie celého posledného riadku
for (let i = 0; i < 5; i++) {
    kinosal[4][i] = 1;
}

Výpis

Výpis poľa opäť vykonáme pomocou cyklu, budeme potrebovať opäť dva cykly (jeden nám proiteruje stĺpce a druhý riadky). Ako správni programátori nevložíme počet riadkov a stĺpcov do cyklov napevno, pretože sa môže zmeniť.

Musíme však pamätať na skutočnosť, že keď sa spýtame na kinosal.length, bude obsahovať počet vnorených polí. Aby sme získali počet riadkov (dĺžku vnútorného poľa), spýtame sa na kinosal[i].length.

Cykly zanoríme do seba tak, aby nám vonkajší cyklus prechádzal riadkami a vnútornými stĺpcami v aktuálnom riadku. Po výpise riadku je nutné odriadkovať. Oba cykly musia mať samozrejme inú riadiacu premennú. Doplníme teda tento kód:

for (let i = 0; i < kinosal.length; i++) {
    for (let j = 0; j < kinosal[i].length; j++) {
        document.write(kinosal[i][j] + " ");
    }
    document.write("<br>");
}

Keď teraz spustíme celý príklad v prehliadači, dostaneme tento výstup:

2D poľa v JavaScripte
localhost

Naplnenie 2D poľa ručne

Dvojrozmerné pole je možné tiež deklarovať a naplniť dátami ručne:

let kinosal = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 1, 1, 1, 0],
    [1, 1, 1, 1, 1]
];

Ak pridáme k tomuto kódu cykly na výpis všetkých prvkov z predchádzajúceho príkladu, dostaneme v prehliadači rovnaký výstup:

2D poľa v JavaScripte
localhost

Výpis sviatkov pre daný deň

Na záver si dnes vytvoríme skript vypisujúci, kto má dnes sviatok. Najprv si vytvoríme pole, kam budeme ukladať ďalšie pole, v ktorom budú uložené sviatky v danom mesiaci. Na pridanie vnorených polí využijeme metódu push(). Postupne takto doplníme položky so všetkými menami v roku.

Potom zistíme aktuálny dátum a pomocou metódy getDate() získame číslo dňa. Metóda vracia hodnotu 131, ak teda chceme získať zodpovedajúci index v poli pre aktuálny deň, musíme odpočítať 1. Poradové číslo mesiaca získame metódou getMonth(). Tá vracia hodnotu od 0 do 11, kde 0 zodpovedá januáru a 11 decembru, získanú hodnotu teda už nemusíme upravovať. Nakoniec vyberieme hľadaný prvok v poli polí, použijeme teda najprv index mesiaca a potom index dňa:

// Tento skript pochádza z webu itnetwork.cz
// Smie byť ľubovoľne používaný aj modifikovaný, ale nesmie z neho byť vymazaný tento text

// vytvoríme si prázdne pole mesiacov a postupne doň pridáme pole so sviatkami v danom mesiaci
let mesice = [];

// január
mesice.push(["Nový rok, Deň obnovy samostatného českého štátu", "Karina", "Radmila", "Diana", "Dalimil", "Traja králi", "Vilma", "Čestmír", "Vladan", "Bretislav", "Bohdana", "Pravosláv", "Edita", "Radovan", "Alice", "Ctirad", "Drahoslav", "Vladislav", "Dúbravka", "Ilona", "Biela", "Slávomier", "Zdeniek", "Milena", "Miloš", "Zora", "Ingrid", "Otýlie", "Zdislava", "Robin", "Marika"]);
// február
mesice.push(["Hyniek", "Nela", "Blažej", "Jarmila", "Dobromila", "Vanda", "Veronika", "Milada", "Apolena", "Mojmír", "Božena", "Slávená", "Venceslav", "Valentín", "Georgína", "Ljuba", "Miloslava", "Gizela", "Patrik", "Oldřich", "Lenka", "Peter", "Svätopluk", "Matej", "Liliana", "Dorota", "Alexandr", "Lumír", "Horymír"]);
// marec
mesice.push(["Bedrich", "Anežka", "Kamil", "Stela", "Kazimír", "Miroslav", "Tomáš", "Gabriela", "Františka", "Viktória", "Anjela", "Rehor", "Ružená", "Rút, Matylda", "Ida", "Elena, Herbert", "Vlastimil", "Eduard", "Josef", "Svetlana", "Radek", "Leona", "Ivona", "Gabriel", "Marián", "Emanuel", "Dita", "Soňa", "Tatiana", "Arnošt", "Kvido"]);
// apríl
mesice.push(["Hugo", "Erika", "Richard", "Ivana", "Miroslava", "Vendula", "Harman, Hermína", "Ema", "Dušan", "Darja", "Izabela", "Julius", "Aleš", "Vincent", "Anastázia", "Irena", "Rudolf", "Valérie", "Rastislav", "Marcela", "Alexandra", "Evženie", "Vojtoch", "Juraj", "Marek", "Oto", "Jaroslav", "Vlastislav", "Robert", "Blahoslav"]);
// máj
mesice.push(["Sviatok práce", "Zikmund", "Alexej", "Kvetoslav", "Klaudia", "Radoslav", "Stanislav", "Deň víťazstva", "Ctibor", "Blažena", "Svätava", "Pankrác", "Servác", "Bonifác", "Žofia", "Premysel", "Aneta", "Nataša", "Ivo", "Zvyšok", "Monika", "Emil", "Vladimír", "Jana", "Viola", "Filip", "Valdemar", "Vilém", "Maxmilián", "Ferdinand", "Kamila"]);
// jún
mesice.push(["Laura", "Jarmil", "Tamara", "Dalibor", "Dobroslav", "Norbert", "Iveta, Slavoj", "Medard", "Stanislava", "Gita", "Bruno", "Antónia", "Antonín", "Roland", "Vít", "Zvyšok", "Adolf", "Milan", "Leoš", "Kveta", "Alois", "Pavla", "Zdenka", "Jan", "Ivan", "Adriana", "Ladislav", "Lubomier", "Peter a Pavel", "Šárka"]);
// júl
mesice.push(["Jaroslava", "Patrícia", "Radomír", "Prokop", "Cyril, Metódaj", "Deň upálenia majstra Jána Husa", "Bohuslava", "Nora", "Drahoslava", "Libuša, Amália", "Olga", "Borok", "Marketa", "Karolína", "Jindřich", "Luboš", "Martina", "Drahomiera", "Čeniek", "Ilja", "Víťazsláv", "Magdaléna", "Libor", "Kristína", "Jakub", "Anna", "Vieroslav", "Viktor", "Marta", "Borivoj", "Ignác"]);
// august
mesice.push(["Oskar", "Gustav", "Miluša", "Dominik", "Kristián", "Oldřiška", "Lada", "Sebeslav", "Roman", "Vavrinec", "Zuzana", "Klára", "Alena", "Alan", "Hana", "Jachým", "Petra", "Helena", "Ľudík", "Bernard", "Johana", "Bohuslav", "Sandra", "Bartolomej", "Radim", "Ludiek", "Otakar", "Augustín", "Evelína", "Vladená", "Pavlína"]);
// septembra
mesice.push(["Linda, Samuel", "Adéla", "Bronislav", "Geniška", "Boris", "Boleslav", "Regína", "Mariana", "Daniela", "Irma", "Denisa", "Marie", "Lubor", "Radka", "Jolana", "Ľudmila", "Nadežda", "Kryštof", "Zita", "Oleg", "Matúš", "Darina", "Berta", "Jaromír", "Zlata", "Andrea", "Jonáš", "Václav, Deň českej štátnosti", "Michal", "Jeroným"]);
// október
mesice.push(["Igor", "Olivie, Oliver", "Bohumil", "Františok", "Eliška", "Hanuš", "Justína", "Vera", "Štefán, Sára", "Marina", "Andrej", "Marcel", "Renáta", "Agáta", "Tereza", "Havel", "Hodvika", "Lukáš", "Michaela", "Vendelín", "Brigita", "Sabína", "Teodor", "Nina", "Beáta", "Erik", "Šarlota, Zoe", "Deň vzniku samostatného československého štátu", "Silvie", "Tadeáš", "Štiepánka"]);
// november
mesice.push(["Felix", "Pamiatka zosnulých (dušičky)", "Hubert", "Karel", "Miriam", "Libená", "Saskie", "Bohumier", "Bohdan", "Evžen", "Martin", "Benedikt", "Tibor", "Sáva", "Leopold", "Otmar", "Mahulena, Deň boja za slobodu a demokraciu", "Romana", "Alžbeta", "Nikola", "Albert", "Cecília", "Klement", "Emília", "Katarína", "Artur", "Xenie", "René", "Zina", "Ondrej"]);
// december
mesice.push(["Iva", "Blanka", "Svätoslav", "Barbora", "Jitka", "Mikuláš", "Benjamín", "Kvetoslava", "Vroclav", "Julie", "Dana", "Simona", "Lucie", "Lýdia", "Radana", "Albína", "Daniel", "Miloslav", "Ester", "Dagmar", "Natálie", "Šimon", "Vlasta", "Adam, Eva, Štedrý deň", "1. sviatok vianočný", "Štepan, 2. sviatok vianočný", "Žaneta", "Bohumila", "Judita", "David", "Silvester"]);

// teraz pristúpime k samotnému výpisu
let dnes = new Date();
let den = dnes.getDate()-1;
let mesic = dnes.getMonth();
document.write("Dnes má meniny " + mesice[mesic][den]);

Výsledok:

Poľa v JavaScripte
localhost

 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 12x (4.3 kB)
Aplikácia je vrátane zdrojových kódov v jazyku JavaScript

 

Predchádzajúci článok
Editor tabuliek v JavaScripte
Všetky články v sekcii
Základné konštrukcie jazyka JavaScript
Preskočiť článok
(neodporúčame)
Striktné operátormi a pretypovanie v JavaScripte
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity