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í.

Lekce 13 - Textové řetězce v JavaScriptu do třetice - Split a join

V minulé lekci, Textové řetězce v JavaScriptu podruhé - Práce se znaky, jsme si ukázali, že textový řetězec je vlastně pole znaků.

V dnešním tutoriálu základů JavaScriptu si vysvětlíme další metody na řetězci, které jsme vám záměrně zatajili, protože jsme nevěděli, že textový řetězec je vlastně pole :)

Metody na řetězci

Když si vytvoříme libovolnou proměnnou a napíšeme za ni poté tečku, zobrazí nám IDE nabídku všech metod a vlastností (a také proměnných, ale k tomu se dostaneme až u objektů), které na ni můžeme volat. Zkusme si to:

Metody na textovém řetězci string ve Visual Studio Code - Základní konstrukce jazyka JavaScript

Samozřejmě to platí pro všechny proměnné i třídy a budeme toho využívat stále častěji. Metody jsou řazené abecedně a můžeme jimi listovat pomocí kurzorových šipek. Visual Studio Code nám navíc zobrazuje i popis metod (co dělají a jaké vyžadují parametry). Tento popis můžeme ve VS Code vyvolat tím, že najedeme kurzorem myši na danou metodu:

Popis vybrané metody na textovém řetězci ve Visual Studio Code - Základní konstrukce jazyka JavaScript

Řekněme si o následujících metodách a ukažme si je na jednoduchých příkladech.

Metoda localeCompare()

Naučíme se porovnávat dva řetězce podle aktuálního jazykového prostředí. V JavaScriptu k tomu slouží metoda localeCompare():

let domaci = 'Argentina';
let hoste = 'Barbados';

let vysledek = domaci.localeCompare(hoste);

if (vysledek < 0) {
    document.write('Řetězec "domaci" je PŘED řetězcem "hoste" v abecedním pořadí.');
} else if (vysledek > 0) {
    document.write('Řetězec "domaci" je ZA řetězcem "hoste" v abecedním pořadí.');
} else {
    document.write('Řetězec "domaci" a "hoste" jsou shodné v abecedním pořadí.');
}

Metoda localeCompare() vrací číslo, které označuje pořadí porovnávaných řetězců v abecedním pořadí. Hodnota -1 znamená, že je první řetězec před řetězcem v parametru. Hodnotu 0 dostaneme, pokud jsou oba textové řetězce stejné. A hodnotu 1 získáme, pokud je první řetězec v abecedě za druhým.

Pro naše řetězce bude výstup v prohlížeči:

Řetězce v JavaScriptu
localhost

Pojďme se nyní podívat na další metody, které jsou opravdu velmi užitečné.

Metoda join()

Metoda join() slouží ke spojení všech prvků pole do jednoho řetězce:

let slova = ['jablko', 'pomeranč', 'banán'];
let veta = slova.join(', '); // spojí prvky pole s čárkou jako oddělovačem
document.write(veta);

Oddělovač mezi prvky pole je volitelný. Pokud není specifikován, prvky jsou spojeny čárkou bez mezery.

Výstup:

Řetězce v JavaScriptu
localhost

Metodu join() můžeme použít namísto cyklu for...of, pokud potřebujeme vypsat všechny položky uložené v poli. V lekci Pole v JavaScriptu jsme vypisovali čísla z pole takto:

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

for (let cislo of cisla) {
    document.write(cislo + " ");
}

Stejného výsledku dosáhneme zápisem:

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

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

Výstup:

Řetězce v JavaScriptu
localhost

Metoda split()

Metoda split() naopak rozdělí řetězec na pole podřetězců podle zadaného znaku (oddělovače):

let otazka = 'jak-se-máš';
let slova = otazka.split("-"); // [0] jak [1] se [2] máš
for (let slovo of slova) {
    document.write(slovo + "<br>");
}

Výstup:

Řetězce v JavaScriptu
localhost

Práce s formátem CSV

Z předchozího tutoriálu víme, že parsování řetězce po znaku může být někdy docela složité a to jsme dělali poměrně jednoduchý příklad. S řetězci se samozřejmě budeme setkávat stále, a to jak na vstupu od uživatele (např. z konzole nebo z polí v okenních aplikacích), tak v souborech TXT a XML. Velmi často máme zadán jeden delší textový řetězec (řádka souboru nebo řádka konzole), ve kterém je více hodnot, oddělených tzv. separátory, např. čárkou. V tomto případě hovoříme o formátu CSV (Comma-Separated Values, tedy hodnoty oddělené čárkou). Abychom si byli jisti, že víme, o čem hovoříme, ukažme si nějaké ukázkové řetězce:

Jan,Novák,Dlouhá 10,Praha 3,130 00
.. ... .-.. .- -. -.. ... --- ..-. -
(1,2,3;4,5,6;7,8,9)

Význam jednotlivých řetězců:

  • První řetězec je očividně nějaký uživatel, takto bychom mohli např. realizovat uložení uživatelů do CSV souboru, každý na jeden řádek.
  • Druhý řetězec jsou znaky Morseovy abecedy, separátor (oddělovač) je zde mezera.
  • Třetí řetězec je matice o 3 sloupcích a 3 řádcích. Oddělovač sloupců je čárka, řádků středník.

Jelikož neumíme tvořit objekty (uživatele), zkusíme si naprogramovat dekodér zpráv z Morseovy abecedy.

Dekodér Morseovy abecedy

Pojďme si opět připravit strukturu programu. Budeme potřebovat dva řetězce se zprávou, jeden se zprávou v Morseově abecedě, druhý zatím prázdný, do kterého budeme ukládat výsledek našeho snažení:

// řetězec, který chceme dekódovat
let sifrovanaZprava = ".-.. . --- -. .- .-. -.. ---";

// řetězec s dekódovanou zprávou
let dekodovanaZprava = "";

Dále budeme jako v případě samohlásek potřebovat nějaký vzor písmen. K písmenům samozřejmě vzor jejich znaku v morseovce:

let abeceda = "abcdefghijklmnopqrstuvwxyz";
let morseovyZnaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
  "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
  "...-", ".--", "-..-", "-.--", "--.."];

Písmena můžeme uložit do pouhého řetězce, protože mají jen jeden znak. Znaky Morseovy abecedy mají již znaků více, ty musíme dát do pole. Struktura našeho programu by nyní mohla vypadat následovně:

Později si můžeme přidat další znaky jako čísla a interpunkční znaménka, my je zde vynecháme.

Nyní si řetězec sifrovanaZprava rozbijeme metodou split() na pole podřetězců, obsahujících jednotlivé znaky morseovky:

// rozbití řetězce na znaky morseovky
let znaky = sifrovanaZprava.split(" ");

// iterace znaky morseovky
for (let morseuvZnak of znaky) {
  // ...
}

Rozdělovat budeme podle znaku mezery. Pole následně proiterujeme cyklem for...of.

Ideálně bychom se měli nějak vypořádat s případy, kdy uživatel zadá např. více mezer mezi znaky (to uživatelé rádi dělají). Metoda split() poté vytvoří o jeden řetězec v poli více, který bude prázdný. Ten bychom měli poté v cyklu detekovat a ignorovat, my se s tím v tutoriálu nebudeme zabývat.

V cyklu se pokusíme najít aktuálně čtený znak morseovky v poli morseovyZnaky. Bude nás zajímat jeho index, protože když se podíváme na ten samý index v poli abeceda, bude tam odpovídající písmeno. To je samozřejmě z toho důvodu, že jak pole tak řetězec obsahují stejné znaky, seřazené dle abecedy. Tělo cyklu tedy doplníme kódem:

// iterace znaky morseovky
for (let morseuvZnak of znaky) {
  let abecedniZnak = '?';

  let index = morseovyZnaky.indexOf(morseuvZnak);

  // znak nalezen
  if (index >= 0) {
    abecedniZnak = abeceda.charAt(index);
  }
  dekodovanaZprava += abecedniZnak;
}

Kód nejprve do abecedního znaku uloží znak ?, protože se může stát, že znak v naší sadě nemáme. Následně se pokusíme zjistit jeho index pomocí metody indexOf(). Pokud jsme znak našli (index >= 0), dosadíme do proměnné abecedniZnak znak z abecedy pod tímto indexem. Nakonec znak připojíme ke zprávě.

Operátor += nahrazuje zprava = zprava + abecedniZnak.

Závěrem samozřejmě vypíšeme původní i dekódovanou zprávu. Celý kód bude vypadat takto:

// řetězec, který chceme dekódovat
let sifrovanaZprava = ".-.. . --- -. .- .-. -.. ---";

// řetězec s dekódovanou zprávou
let dekodovanaZprava = "";

let abeceda = "abcdefghijklmnopqrstuvwxyz";
let morseovyZnaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
  "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
  "...-", ".--", "-..-", "-.--", "--.."];

// rozbití řetězce na znaky morseovky
let znaky = sifrovanaZprava.split(" ");

// iterace znaky morseovky
for (let morseuvZnak of znaky) {
  let abecedniZnak = '?';

  let index = morseovyZnaky.indexOf(morseuvZnak);

  // znak nalezen
  if (index >= 0) {
    abecedniZnak = abeceda.charAt(index);
  }
  dekodovanaZprava += abecedniZnak;
}

document.write("Původní zpráva: " + sifrovanaZprava + "<br>");
document.write("Dekódovaná zpráva: " + dekodovanaZprava + "<br>");

Výstup programu:

Řetězce v JavaScriptu
localhost

Hotovo! Za úkol máte si naprogramovat program opačný, který naopak zakóduje řetězec do morseovky, kód bude velmi podobný. S metodami split() a join() se potkáme během kurzu ještě několikrát.

V další lekci, Funkce v JavaScriptu, se podíváme na funkce. Budeme jim předávat parametry, poté budou vracet a ukládat hodnotu.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 34x (2.98 kB)
Aplikace je včetně zdrojových kódů v jazyce JavaScript

 

Předchozí článek
Textové řetězce v JavaScriptu podruhé - Práce se znaky
Všechny články v sekci
Základní konstrukce jazyka JavaScript
Přeskočit článek
(nedoporučujeme)
Funkce v JavaScriptu
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
84 hlasů
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 se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity