HALLOWEEN JE TADY: Získej 66 % extra kreditů zdarma při nákupu od 1199 kreditů s promo kódem NEBOJSEIT66. Zjisti více:
NOVINKA: Začni v IT jako webmaster s komplexním akreditovaným online kurzem Tvůrce WWW stránek. Zjisti více:

Lekce 14 - 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 se naučíme pracovat s našeptávačem. Dále si vysvětlíme další metody na řetězci, které pracují s polem.

Našeptávač Visual Studia Code

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í, které na ni můžeme v závislosti na jejím typu volat. Zkusme si to, vytvořme si proměnnou pozdrav s textovým řetězcem a následně napišme na nový řádek pozdrav. :

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

Vidíme výpis všech metod a vlastností řetězce, které můžeme použít.

Samozřejmě to platí i pro další datové typy a tohoto našeptávače budeme využívat stále častěji, protože si představíme ještě spoustu metod a nebudeme si je všechny pamatovat z hlavy. Metody jsou v našeptávači ř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

Metody pro práci s řetězci a poli

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

Metoda split()

Metoda split() převede řetězec na pole. To udělá tak, že jej rozdělí na podřetězce podle zadaného oddělovače. Můžeme tak např. rozdělit text na slova, když jako oddělovač použijeme mezeru:

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

Výstup:

Řetězce v JavaScriptu
localhost

Metoda join()

Metoda join() dělá opačnou akci. Slouží k převedení pole na řetězec. Všechny prvky pole spojí do jednoho řetězce pomocí zadaného oddělovače. Kód níže spojí prvky pole do jednoho řetězce a oddělí je čárkou a mezerou:

let ovoce = ['jablko', 'pomeranč', 'banán'];
let text = ovoce.join(', '); // spojí prvky pole s čárkou jako oddělovačem
document.body.innerHTML += text;

Výstup:

Řetězce v JavaScriptu
localhost

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

Práce s formátem CSV

Z předchozích lekcí 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.

Dekodér Morseovy abecedy

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

Příprava proměnných

Budeme potřebovat dva řetězce:

  • jeden se zprávou v Morseově abecedě,
  • druhý zatím prázdný, do kterého budeme ukládat výsledek našeho snažení.

Kód bude následující:

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

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

Dále budeme potřebovat nějaký vzor písmen. A samozřejmě i 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.

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

Převod zprávy na pole

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) {
    // ...
}

Zprávu budeme rozdělovat 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. Metoda split() poté vytvoří o jeden řetězec v poli více, který bude prázdný. K tomu se dá zadat jako oddělovač tzv. regulární výraz. Ty jsou však nad rámec tohoto kurzu.

Vyhledání daného Morseova znaku

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 řetězci 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.

Výpis zpráv a dokončení

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.body.innerHTML += "Původní zpráva: " + sifrovanaZprava + "<br>";
document.body.innerHTML += "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 277x (3.28 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í:
803 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