IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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

V minulej lekcii, Poľa v JavaScripte, sme sa naučili používať pole. Ukázali sme si prácu s prvkami poľa.

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().

Radenie textu

Táto metóda nám zoradí textové reťazce podľa abecedy (vzostupne):

let names = ["Daniel", "Robin", "Hansel", "Annie"];
names.sort();
for (let name of names) {
    document.write(name + " ");
}

Výstup v prehliadači:

Arrays in JavaScript
localhost

Zostupné radenie

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ýpis prvkov poľa:

names.reverse();
for (let name of names) {
    document.write(name + " ");
}

Výstup v prehliadači:

Arrays in JavaScript
localhost

Radenie čísel

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

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

Výstup:

Arrays in JavaScript
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 numbers = [5, 3, 30, 25];
numbers.sort(function(a, b) { return a - b });
for (let number of numbers) {
    document.write(number + " ");
}

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

Arrays in JavaScript
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 polia 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 JavaScripte - 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 movieTheater. Do toho potom pomocou cyklu vložíme nové polia zápisom:

movieTheater[i] = [];

Pomocou vnoreného cyklu potom naplníme vnorené polia dátami. Definícia takého poľa pre kinosála, ktorá by na začiatku obsahovala samé 0, vyzerá takto:

let movieTheater = [];

for (let i = 0; i < 5; i++) {
    movieTheater[i] = [];
    for (let j = 0; j < 5; j++) {
        movieTheater[i][j] = 0; // filling the array with 0
    }
}

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:

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

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 movieTheater[2][2]. Predošlý kód doplníme takto:

movieTheater[2][2] = 1;

// Edit of the 4th row
for (let i = 1; i < 4; i++) {
    movieTheater[3][i] = 1;
}

// Filling the entire last row
for (let i = 0; i < 5; i++) {
    movieTheater[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 movieTheater.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 movieTheater[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. Pre výpis 2D využijeme HTML tabuľku. Oba cykly musia mať samozrejme inú riadiacu premennú. Doplníme teda tento kód:

document.write("<table border='1'>");

for (let i = 0; i < movieTheater.length; i++) {
    document.write("<tr>");
    for (let j = 0; j < movieTheater[i].length; j++) {
        document.write("<td>"+ movieTheater[i][j] + "</td>");
    }
    document.write("</tr>");
}

document.write("</table>");

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

2D arrays in JavaScript
localhost

Naplnenie 2D poľa ručne

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

let movieTheater = [
    [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 arrays in JavaScript
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:

// This script comes from the web ictdemy.com
// It may be used and modified as desired, but this text may not be deleted from it

// we will create an empty arrays of months and gradually add to it a field with holidays in the given month
let months = [];

// January
months.push(["New Year's Day", "Basil", "Genevieve", "Elizabeth Ann Seton", "Edward the Confessor", "Epiphany (Three Kings' Day)", "Raymond", "Lucian", "Adrian", "William", "Theodosius", "Aelred", "Hilary", "Felix", "Paul", "Marcellus", "Anthony", "Margaret", "Wulfstan", "Fabian", "Agnes", "Vincent", "Emerentiana", "Francis de Sales", "Conversion of Saint Paul", "Timothy and Titus", "Angela", "Thomas Aquinas", "Gildas", "Charles", "John Bosco"]);
// February
months.push(["Brigid", "Presentation of Jesus", "Blaise", "Gilbert", "Agatha", "Paul Miki and Companions", "Colette", "Jerome Emiliani", "Apollonia", "Scholastica", "Our Lady of Lourdes", "Damian", "Catherine de Ricci", "Cyril and Methodius (Valentine's Day)", "Faustina", "Juliana", "Seven Founders of the Servite Order", "Bernadette", "Conrad", "Eleutherius", "Peter Damian", "Chair of Saint Peter", "Polycarp", "Matthias", "Walburga", "Alexander", "Gabriel of Our Lady of Sorrows", "Oswald", "John Cassian (Leap Year)"]);
// March
months.push(["David", "Chad", "Katharine Drexel", "Casimir", "John Joseph of the Cross", "Colette", "Perpetua and Felicity", "John of God", "Frances of Rome", "Victor", "Rosalia", "Gregory", "Euphrasia", "Matilda", "Louise de Marillac", "Heribert", "Patrick (Saint Patrick's Day)", "Cyril of Jerusalem", "Joseph (Saint Joseph's Day)", "Cuthbert", "Benedict", "Lea", "Turibius of Mogrovejo", "Gabriel", "Annunciation", "Margaret Clitherow", "John of Egypt", "Sixtus III", "Gladys", "John Climacus", "Benjamin"]);
// April
months.push(["Hugh", "Francis of Paola", "Richard of Chichester", "Isidore", "Vincent Ferrer", "William of Eskilsoe", "John Baptist de la Salle", "Julie Billiart", "Mary Cleophas", "Fulbert of Chartres", "Gemma Galgani", "Julius I", "Martin I", "Lidwina", "Paternus", "Bernadette", "Stephen Harding", "Perfectus", "Emma", "Agnes of Montepulciano", "Anselm", "Soter and Caius", "George (Saint George's Day)", "Fidelis", "Mark", "Cletus", "Zita", "Peter Chanel", "Catherine of Siena", "Pius V"]);
// May
months.push(["Joseph the Worker", "Athanasius", "Philip and James", "Florian", "Hilary of Arles", "John before the Latin Gate", "Stanislav", "Victor", "Gregory Nazianzen", "Solomon", "Ignatius", "Pancras", "Servatius", "Boniface", "Isidore the Farmer", "Margaret of Cortona", "Paschal Baylon", "John I", "Dunstan", "Bernardine of Siena", "Christopher Magallanes", "Rita of Cascia", "John Baptist Rossi", "Mary Help of Christians", "Bede", "Philip Neri", "Augustine of Canterbury", "Germanus", "Maximinus", "Joan of Arc", "Visitation of the Blessed Virgin Mary"]);
// June
months.push(["Justin", "Marcellinus and Peter", "Charles Lwanga and Companions", "Francis Caracciolo", "Boniface", "Norbert", "Robert of Newminster", "William of York", "Columba", "Margaret of Scotland", "Barnabas", "John of St. Facundo", "Anthony of Padua", "Methodius", "Vitus", "John Francis Regis", "Botolph", "Gregory Barbarigo", "Romuald", "Silverius", "Aloysius Gonzaga", "Thomas More", "John Fisher", "Nativity of John the Baptist", "Prosper", "Josemaria Escriva", "Cyril of Alexandria", "Irenaeus", "Peter and Paul", "First Martyrs of the Church of Rome"]);
// July
months.push(["Aaron", "Otto", "Thomas", "Elizabeth of Portugal", "Anthony Maria Zaccaria", "Maria Goretti", "Pantaenus", "Kilian", "Augustine Zhao Rong", "Rufina", "Benedict", "John Gualbert", "Henry", "Kateri Tekakwitha", "Bonaventure", "Our Lady of Mount Carmel", "Alexis", "Frederick", "Macrina", "Apollinaris", "Lawrence of Brindisi", "Mary Magdalene", "Bridget of Sweden", "Charbel Makhlouf", "James the Greater", "Joachim and Anne", "Pantaleon", "Victor I", "Martha", "Peter Chrysologus", "Ignatius of Loyola"]);
// August
months.push(["Alphonsus Liguori", "Eusebius of Vercelli", "Lydia", "John Vianney", "Transfiguration of the Lord", "Oswald", "Sixtus II", "Dominic", "Teresa Benedicta of the Cross", "Lawrence", "Clare", "Jane Frances de Chantal", "Hippolytus", "Maximilian Kolbe", "Assumption of the Blessed Virgin Mary", "Stephen of Hungary", "Hyacinth", "Helena", "John Eudes", "Bernard", "Pius X", "Queenship of Mary", "Rose of Lima", "Bartholomew", "Louis of France", "Joseph Calasanz", "Monica", "Augustine of Hippo", "Beheading of John the Baptist", "Jeanne Jugan", "Raymond Nonnatus"]);
// September
months.push(["Giles", "Ingrid", "Gregory the Great", "Rosalia", "Teresa of Calcutta", "Eleutherius", "Regina", "Nativity of the Blessed Virgin Mary", "Peter Claver", "Nicholas of Tolentino", "Paphnutius", "Most Holy Name of Mary", "John Chrysostom", "Exaltation of the Holy Cross", "Our Lady of Sorrows", "Cornelius and Cyprian", "Robert Bellarmine", "Joseph of Cupertino", "Januarius", "Andrew Kim Taegon", "Matthew", "Maurice", "Pio of Pietrelcina", "Our Lady of Walsingham", "Sergius", "Cosmas and Damian", "Vincent de Paul", "Wenceslaus", "Michael, Gabriel and Raphael", "Jerome"]);
// October
months.push(["Therese of Lisieux", "Guardian Angels", "Gerard of Brogne", "Francis of Assisi", "Faustina Kowalska", "Bruno", "Our Lady of the Rosary", "Pelagia", "Denis and Companions", "Francis Borgia", "John XXIII", "Wilfrid", "Taylor", "Callistus I", "Teresa of Avila", "Margaret Mary Alacoque", "Ignatius of Antioch", "Luke", "Isaac Jogues and Companions", "Paul of the Cross", "Hilarion", "John Paul II", "John of Capistrano", "Anthony Mary Claret", "Crispin", "Alfred the Great", "Frumentius", "Simon and Jude", "Narcissus", "Marcellus", "All Hallows Eve"]);
// November
months.push(["All Saints' Day", "All Souls' Day", "Martin de Porres", "Charles Borromeo", "Elizabeth", "Leonard", "Willibrord", "Godfrey", "Dedication of the Lateran Basilica", "Leo the Great", "Martin of Tours (Remembrance Day)", "Josaphat", "Stanislav Kostka", "Lawrence O'Toole", "Albert the Great", "Greta", "Elizabeth of Hungary", "Rose Philippine Duchesne", "Mechtilde", "Edmund", "Presentation of the Blessed Virgin Mary", "Cecilia", "Clement I", "Andrew Dung-Lac and Companions", "Catherine of Alexandria", "John Berchmans", "Virgil", "James of the Marches", "Saturninus", "Andrew (Saint Andrew's Day)"]);
// December
months.push(["Edmund Campion", "Bibiana", "Francis Xavier", "John Damascene", "Sabbas", "Nicholas", "Ambrose", "Immaculate Conception", "Juan Diego", "Eulalia", "Damasus I", "Our Lady of Guadalupe", "Lucy", "John of the Cross", "Nino", "Adelaide", "Lazarus", "Flannan", "Anastasius I", "Dominic of Silos", "Peter Canisius", "Frances Xavier Cabrini", "John of Kanty", "Christmas Eve", "Christmas Day", "Stephen (Boxing Day)", "John the Apostle", "Holy Innocents", "Thomas Becket", "Sylvester I", "John Wycliffe"]);

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:

// now we proceed to the statement itself
let today = new Date();
let day = today.getDate()-1;
let month = today.getMonth();
document.write("Today is  " + months[month][day] + "'s name day");

Výsledok:

Arrays in JavaScript
localhost

V nasledujúcom cvičení, Riešené úlohy k 9.-10. lekciu JavaScriptu, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

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é 6x (5.26 kB)
Aplikácia je vrátane zdrojových kódov v jazyku JavaScript

 

Predchádzajúci článok
Poľa v JavaScripte
Všetky články v sekcii
Základné konštrukcie jazyka JavaScript
Preskočiť článok
(neodporúčame)
Riešené úlohy k 9.-10. lekciu JavaScriptu
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
5 hlasov
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