04.14 Destructuring polí
Výuka
Proč Destructuring?
Destructuring (destrukturalizace) je moderní syntaxe pro rozbalení hodnot z pole do samostatných proměnných. Místo přístupu k prvkům pomocí indexů můžeš hodnoty "vytáhnout" přímo.
Proč to potřebujeme?
- Čitelnost - Místo
arr[0],arr[1]použiješ pojmenované proměnné - Kratší kód - Jedna řádka místo několika přiřazení
- Swap hodnot - Prohoď proměnné bez pomocné proměnné
- Extrakce dat - Vytáhni hodnoty z návratové hodnoty funkce
Představ si to jako: Rozbalení dárků. Místo "vezmi první dárek z krabice" říkáš "tohle je hračka, tohle kniha, tohle čokoláda" - přiřadíš jména přímo při rozbalování.
Jak to funguje?
Destructuring syntaxe:
const [a, b, c] = pole;
1. Levá strana = vzor (pattern) s názvy proměnných
2. Pravá strana = pole
3. Hodnoty z pole se přiřadí do proměnných podle POŘADÍ
4. a = pole[0], b = pole[1], c = pole[2]
Klíčové koncepty
- Destructuring - rozbalení hodnot z pole do proměnných
- Pattern matching - vzor na levé straně odpovídá struktuře pole
- Pořadí záleží - přiřazuje se podle pozice, ne podle názvu
- Default values - můžeš zadat výchozí hodnoty
- Rest element
...- zbytek prvků do pole - Swap - prohození proměnných bez pomocné proměnné
JavaScript
Příklad 1: Základní destructuring
const fruits = ['jablko', 'banán', 'třešeň'];
// Klasický způsob
const first = fruits[0];
const second = fruits[1];
console.log(first, second);
// → jablko banán
// S destructuring
const [a, b, c] = fruits;
console.log(a); // → jablko
console.log(b); // → banán
console.log(c); // → třešeň
Co se stalo?
[a, b, c] = fruits- vytvoř proměnnéa,b,cadostanefruits[0],bdostanefruits[1],cdostanefruits[2]- Kratší a čitelnější než
const a = fruits[0]
Příklad 2: Přeskočení prvků
const numbers = [1, 2, 3, 4, 5];
// Vezmi první a třetí (přeskoč druhý)
const [first, , third] = numbers;
console.log(first); // → 1
console.log(third); // → 3
// Vezmi jen první a čtvrtý
const [a, , , d] = numbers;
console.log(a, d);
// → 1 4
// Ignoruj všechny kromě posledního - NEFUNGUJE DOBŘE
// Lepší: použij slice
const last = numbers[numbers.length - 1]; // → 5
Co se stalo?
- Prázdné místo
, ,- přeskočí prvek - Můžeš vybrat jen některé prvky
- Pro poslední prvek lepší
arr[arr.length - 1]neboarr.at(-1)
Příklad 3: Default values (výchozí hodnoty)
const arr = [1, 2];
// Bez default hodnoty - undefined
const [a, b, c] = arr;
console.log(c);
// → undefined (pole má jen 2 prvky)
// S default hodnotou
const [x, y, z = 0] = arr;
console.log(z);
// → 0 (použije se default hodnota)
// Default hodnota se použije JEN pokud prvek je undefined
const arr2 = [1, 2, null];
const [p, q, r = 0] = arr2;
console.log(r);
// → null (ne 0! null !== undefined)
Co se stalo?
- Default hodnota:
z = 0 - Použije se jen když prvek je
undefined null,0,''jsou validní hodnoty - default se NEPOUŽIJE
Příklad 4: Rest element (...rest)
const numbers = [1, 2, 3, 4, 5];
// Vezmi první dva, zbytek do pole
const [first, second, ...rest] = numbers;
console.log(first); // → 1
console.log(second); // → 2
console.log(rest); // → [3, 4, 5] (zbytek jako pole)
// Vezmi první, zbytek ignoruj
const [head] = numbers;
console.log(head);
// → 1
// Ignoruj první, vezmi zbytek
const [, ...tail] = numbers;
console.log(tail);
// → [2, 3, 4, 5]
// Rest musí být POSLEDNÍ
// const [...all, last] = numbers; // ❌ Syntax Error!
Co se stalo?
- Rest element
...rest- zbývající prvky do nového pole - Musí být poslední (jinak syntax error)
- Užitečné pro "první a zbytek"
Příklad 5: Swap (prohození) proměnných
let a = 1;
let b = 2;
// Klasický swap (s pomocnou proměnnou)
let temp = a;
a = b;
b = temp;
console.log(a, b);
// → 2 1
// S destructuring - bez pomocné proměnné!
a = 1;
b = 2;
[a, b] = [b, a];
console.log(a, b);
// → 2 1
// Můžeš prohodit i více hodnot
let x = 1, y = 2, z = 3;
[x, y, z] = [z, x, y];
console.log(x, y, z);
// → 3 1 2
Co se stalo?
[a, b] = [b, a]- vytvoř pole[2, 1]a rozbal doa,b- Bez pomocné proměnné!
- Elegantní a čitelné
Příklad 6: Destructuring návratové hodnoty funkce
function getCoordinates() {
return [50.0755, 14.4378]; // Praha souřadnice
}
// Bez destructuring
const coords = getCoordinates();
const lat = coords[0];
const lng = coords[1];
// S destructuring - v jedné řádce!
const [latitude, longitude] = getCoordinates();
console.log(latitude); // → 50.0755
console.log(longitude); // → 14.4378
// Praktický příklad - split
const fullName = 'Jan Novák';
const [firstName, lastName] = fullName.split(' ');
console.log(firstName); // → Jan
console.log(lastName); // → Novák
// Regex match
const match = /(\d+)-(\d+)/.exec('100-200');
if (match) {
const [, first, second] = match; // Přeskoč match[0] (celý match)
console.log(first, second); // → 100 200
}
Co se stalo?
- Destructuring funguje skvěle s funkcemi vracejícími pole
split(),match(),exec()- všechny vracejí pole- Čitelnější názvy než
result[0],result[1]
TypeScript
TypeScript přidává typovou kontrolu destructuringu.
Stejné příklady s typy
// Destructuring s typy
const fruits: string[] = ['jablko', 'banán'];
const [first, second]: [string, string] = fruits as [string, string];
// TypeScript inferuje typy
const numbers: number[] = [1, 2, 3];
const [a, b, c] = numbers; // a, b, c jsou number
// Default hodnoty s typy
const [x, y, z = 0]: number[] = [1, 2];
// z má typ number (z default hodnoty)
// Rest element s typy
const [head, ...tail]: number[] = [1, 2, 3, 4];
// head: number, tail: number[]
// Tuple destructuring (přesné typy na pozicích)
const tuple: [string, number] = ['Alice', 25];
const [name, age] = tuple;
// name: string, age: number (TypeScript ví!)
// Funkce vracející tuple
function getUser(): [string, number] {
return ['Bob', 30];
}
const [userName, userAge] = getUser();
// userName: string, userAge: number
// Chybová kontrola - špatný počet prvků
const pair: [number, number] = [1, 2];
// const [a, b, c] = pair; // ⚠️ c bude undefined (ale bez erroru)
// Lepší s tuple
const [a2, b2]: [number, number] = pair; // ✅ Přesně 2 prvky
TypeScript přidává:
- ✅ Inference typů - TypeScript pozná typ prvků
- ✅ Tuple typy - přesné typy na konkrétních pozicích
- ✅ Kontrolu default hodnot - musí odpovídat typu
- ✅ Prevenci chyb - upozorní na problém už při kompilaci
Rozdíl JS vs TS
JavaScript:
- Destructuring funguje bez typové kontroly
- Můžeš omylem přiřadit špatný počet proměnných
- Flexibilnější, ale nebezpečnější
TypeScript:
- Destructuring má typovou kontrolu
- Tuple typy zajistí správný počet a typy prvků
- Bezpečnější, prevence chyb
// JavaScript - projde, ale c je undefined
const arr = [1, 2];
const [a, b, c] = arr;
console.log(c * 2); // NaN!
// TypeScript - upozorní
const arr: [number, number] = [1, 2];
const [a, b]: [number, number] = arr; // ✅ OK
// const [a, b, c]: [number, number, number] = arr; // ❌ Error: Type has only 2 elements
Tip
💡 Používej destructuring pro lepší čitelnost:
// ❌ Špatně - indexy jsou nečitelné
function processPoint(point) {
const x = point[0];
const y = point[1];
return x * 2 + y * 2;
}
// ✅ Dobře - pojmenované proměnné
function processPoint([x, y]) {
return x * 2 + y * 2;
}
💡 Rest pro "první a zbytek" pattern:
const [first, ...rest] = array;
console.log('První:', first);
console.log('Zbytek:', rest);
// Praktické použití
function sum([head, ...tail]) {
if (head === undefined) return 0;
return head + sum(tail);
}
💡 Swap bez pomocné proměnné:
// ❌ Starý způsob
let temp = a;
a = b;
b = temp;
// ✅ Moderní způsob
[a, b] = [b, a];
// Rotace více hodnot
[a, b, c] = [c, a, b];
Kvíz
Co vypíše tento kód?
const arr = [1, 2, 3, 4, 5];
const [a, , b, ...rest] = arr;
console.log(rest.length);
✅ - - a = arr[0] = 1
- Přeskoč
arr[1]=2(prázdné místo, ,) b=arr[2]=3...rest= zbytek od indexu 3 =[4, 5]rest.length=2
❌ - Zapomněl jsi, že jeden prvek byl přeskočen
❌ - rest neobsahuje a a b
❌ - rest neobsahuje VŠECHNY prvky
Důležité: Rest element bere zbývající prvky (po destructuringu předchozích)!
Důležité: Rest element bere zbývající prvky (po destructuringu předchozích)!
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 04.01 Vytvoření pole
- 04.02 Přístup k prvkům
- 04.03 Push, pop, shift, unshift
- 04.04 Slice a splice
- 04.06 Filter
- 04.07 Reduce
- 04.08 Find a findIndex
- 04.09 Some a every
- 04.10 Sort
- 04.11 Spread operátor
- 04.12 Set
- 04.13 Map kolekce
- 04.14 Destructuring polí
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě