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

13. diel - Textové reťazce v JavaScripte do tretice - Split a join

V minulej lekcii, Textové reťazce v JavaScripte druhýkrát - Práca so znakmi, sme si ukázali, že textový reťazec je vlastne pole znakov.

V dnešnom tutoriále základov JavaScriptu si vysvetlíme ďalšie metódy na reťazci, ktoré sme vám zámerne zatajili, pretože sme nevedeli, že textový reťazec je vlastne pole :)

Metódy na reťazci

Keď si vytvoríme ľubovoľnú premennú a napíšeme za ňu potom bodku, zobrazí nám IDE ponuku všetkých metód a vlastností (a tiež premenných, ale k tomu sa dostaneme až pri objektoch), ktoré na ňu môžeme volať. Skúsme si to:

Metódy na textovom reťazci string vo Visual Studio Code - Základné konštrukcie jazyka JavaScript

Samozrejme to platí pre všetky premenné aj triedy a budeme to využívať stále častejšie. Metódy sú radené abecedne a môžeme nimi listovať pomocou kurzorových šípok. Visual Studio Code nám navyše zobrazuje aj popis metód (čo robia a aké vyžadujú parametre). Tento popis môžeme vo VS Code vyvolať tým, že prejdeme kurzorom myši na danú metódu:

Popis vybranej metódy na textovom reťazci vo Visual Studio Code - Základné konštrukcie jazyka JavaScript

Povedzme si o nasledujúcich metódach a ukážme si ich na jednoduchých príkladoch.

Metóda localeCompare()

Naučíme sa porovnávať dva reťazce podľa aktuálneho jazykového prostredia. V JavaScripte na to slúži metóda localeCompare():

let hosts = 'Argentina';
let visitors = 'Barbados';

let result = hosts.localeCompare(visitors);

if (result < 0) {
    document.write('String "hosts" is BEFORE the string "visitors" in alphabetical order.');
} else if (result > 0) {
    document.write('String "hosts" is AFTER the string "visitors" in alphabetical order.');
} else {
    document.write('String "hosts" and "visitors" matches in alphabetical order.');
}

Metóda localeCompare() vracia číslo, ktoré označuje poradie porovnávaných reťazcov v abecednom poradí. Hodnota -1 znamená, že prvý reťazec je pred reťazcom v parametri. Hodnotu 0 dostaneme, ak sú oba textové reťazce rovnaké. A hodnotu 1 získame, pokiaľ je prvý reťazec v abecede za druhým.

Pre naše reťazce bude výstup v prehliadači:

Strings in JavaScript
localhost

Poďme sa teraz pozrieť na ďalšie metódy, ktoré sú naozaj veľmi užitočné.

Metóda join()

Metóda join() slúži na spojenie všetkých prvkov poľa do jedného reťazca:

let words = ['apple', 'orange', 'banana'];
let sentence = words.join(', '); // joins array elements with a comma as a separator
document.write(sentence);

Oddeľovač medzi prvkami poľa je voliteľný. Ak nie je špecifikovaný, prvky sú spojené čiarkou bez medzery.

Výstup:

Strings in JavaScript
localhost

Metódu join() môžeme použiť namiesto cyklu for...of, ak potrebujeme vypísať všetky položky uložené v poli. V lekcii Pole v JavaScripte sme vypisovali čísla z poľa takto:

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (let number of numbers) {
    document.write(number + " ");
}

Rovnaký výsledok dosiahneme zápisom:

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

document.write(numbers.join(' '));

Výstup:

Strings in JavaScript
localhost

Metóda split()

Metóda split() naopak rozdelí reťazec na pole podreťazcov podľa zadaného znaku (oddeľovača):

let question = 'how-are-you';
let words = question.split("-"); // [0] how [1] are [2] you
for (let word of words) {
    document.write(word + "<br>");
}

Výstup:

Strings in JavaScript
localhost

Práca s formátom CSV

Z predchádzajúceho tutoriálu vieme, že parsovanie reťazca po znaku môže byť niekedy celkom zložité a to sme robili pomerne jednoduchý príklad. S reťazcami sa samozrejme budeme stretávať stále, a to ako na vstupe od používateľa (napr. z konzoly alebo z polí v okenných aplikáciách), tak v súboroch TXT a XML. Veľmi často máme zadaný jeden dlhší textový reťazec (riadka súboru alebo riadok konzoly), v ktorom je viac hodnôt, oddelených tzv. separátormi, napr. čiarkou. V tomto prípade hovoríme o formáte CSV (Comma-Separated Values, teda hodnoty oddelené čiarkou). Aby sme si boli istí, že vieme, o čom hovoríme, ukážme si nejaké ukážkové reťazce:

John,Murphy,Long street 10,Dublin 3,D03 XYZ
.. ... .-.. .- -. -.. ... --- ..-. -
(1,2,3;4,5,6;7,8,9)

Význam jednotlivých reťazcov:

  • Prvý reťazec je očividne nejaký používateľ, takto by sme mohli napr. realizovať uloženie používateľov do CSV súboru, každý na jeden riadok.
  • Druhý reťazec sú znaky Morseovej abecedy, separátor (oddeľovač) je tu medzera.
  • Tretí reťazec je matica s 3 stĺpcami a 3 riadkami. Oddeľovač stĺpcov je čiarka, riadkov bodkočiarka.

Keďže nevieme tvoriť objekty (užívateľa), skúsime si naprogramovať dekodér správ z Morseovej abecedy.

Dekodér Morseovej abecedy

Poďme si opäť pripraviť štruktúru programu. Budeme potrebovať dva reťazce so správou, jeden so správou v Morseovej abecede, druhý zatiaľ prázdny, do ktorého budeme ukladať výsledok nášho snaženia:

// the string we want to decode
let encryptedMessage= ".-.. . --- -. .- .-. -.. ---";

// string with the decrypted message
let decryptedMessage= "";

Ďalej budeme ako v prípade samohlások potrebovať nejaký vzor písmen. K písmenám samozrejme vzor ich znaku v morseovke:

let alphabet = "abcdefghijklmnopqrstuvwxyz";
let morseCodes = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
  "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
  "...-", ".--", "-..-", "-.--", "--.."];

Písmená môžeme uložiť do obyčajného reťazca, pretože majú iba jeden znak. Znaky Morseovej abecedy majú už znakov viac, tie musíme dať do poľa.

Neskôr si môžeme pridať ďalšie znaky ako čísla a interpunkčné znamienka, my ich tu vynecháme.

Teraz si reťazec encryptedMessage rozbijeme metódou split() na pole podreťazcov, obsahujúcich jednotlivé znaky morzeovky:

// breaking the string into Morse code characters
let characters = encryptedMessage.split(" ");

// iteration of morse code characters
for (let morseCode of characters) {
    // ...
}

Rozdeľovať budeme podľa znaku medzery. Pole následne proiterujeme cyklom for...of.

Ideálne by sme sa mali nejako vysporiadať s prípadmi, keď používateľ zadá napr. viac medzier medzi znakmi (to používatelia radi robia). Metóda split() potom vytvorí o jeden reťazec v poli viac, ktorý bude prázdny. Ten by sme mali potom v cykle detekovať a ignorovať, my sa s tým v tutoriáli nebudeme zaoberať.

V cykle sa pokúsime nájsť aktuálne čítaný znak morzeovky v poli morseCodes. Bude nás zaujímať jeho index, pretože keď sa pozrieme na ten istý index v reťazci alphabet, bude tam zodpovedajúce písmeno. To je samozrejme z toho dôvodu, že pole aj reťazec obsahujú rovnaké znaky, zoradené podľa abecedy. Telo cyklu teda doplníme kódom:

// iteration of morse code characters
for (let morseCode of characters) {
    let alphabetCharacter = '?';

    let index = morseCodes.indexOf(morseCode);

    // character has been found
    if (index >= 0) {
        alphabetCharacter = alphabet.charAt(index);
    }
    decryptedMessage += alphabetCharacter;
}

Kód najskôr do abecedného znaku uloží znak ?, pretože sa môže stať, že znak v našej sade nemáme. Následne sa pokúsime zistiť jeho index pomocou metódy indexOf(). Ak sme znak našli (index >= 0), dosadíme do premennej alphabetCharacter znak z abecedy pod týmto indexom. Nakoniec znak pripojíme k správe.

Operátor += nahrádza message = message + alphabetCharacter.

Na záver samozrejme vypíšeme pôvodnú aj dekódovanú správu. Celý kód bude vyzerať takto:

// the string we want to decode
let encryptedMessage = ".-.. . --- -. .- .-. -.. ---";

// string with the decoded message
let decryptedMessage = "";

let alphabet = "abcdefghijklmnopqrstuvwxyz";
let morseCodes = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
    "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
    "...-", ".--", "-..-", "-.--", "--.."];

// breaking the string into Morse code characters
let characters = encryptedMessage.split(" ");

// iteration of morse code characters
for (let morseCode of characters) {
    let alphabetCharacter = '?';

    let index = morseCodes.indexOf(morseCode);

    // character has been found
    if (index >= 0) {
        alphabetCharacter = alphabet.charAt(index);
    }
    decryptedMessage += alphabetCharacter;
}

document.write("Original message: " + encryptedMessage + "<br>");
document.write("Decrypted message: " + decryptedMessage + "<br>");

Výstup programu:

Strings in JavaScript
localhost

Hotovo! Za úlohu máte si naprogramovať program opačný, ktorý naopak zakóduje reťazec do morzeovky, kód bude veľmi podobný. S metódami split() a join() sa stretneme počas kurzu ešte niekoľkokrát.

V ďalšej lekcii, Funkcie v JavaScripte, sa pozrieme na funkcie. Budeme im odovzdávať parametre, potom budú vracať a ukladať hodnotu.


 

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

 

Predchádzajúci článok
Textové reťazce v JavaScripte druhýkrát - Práca so znakmi
Všetky články v sekcii
Základné konštrukcie jazyka JavaScript
Preskočiť článok
(neodporúčame)
Funkcie v JavaScripte
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
4 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