04.09 Some a every
Výuka
Proč Some a every?
some() a every() jsou metody pro testování prvků pole. some() ověřuje, zda alespoň jeden prvek splňuje podmínku. every() ověřuje, zda všechny prvky splňují podmínku.
Proč to potřebujeme?
- Validace dat - Zkontroluj, zda všichni uživatelé jsou dospělí
- Podmíněné větvení - Pokud existuje chyba, zobraz varování
- Optimalizace - Zastaví se po prvním nálezu (neprochází celé pole)
- Čitelnost - Místo smyčky s flagy použiješ jasnou metodu
Představ si to jako: Kontrola vstupenek na koncert. every() ověřuje "Mají všichni vstupenku?". some() ověřuje "Má alespoň někdo VIP vstupenku?".
Jak to funguje?
some(predicate):
1. Volá predikát pro každý prvek (zleva doprava)
2. Vrátí TRUE, pokud ALESPOŇ JEDEN prvek vyhovuje
3. Vrátí FALSE, pokud ŽÁDNÝ prvek nevyhovuje
4. Zastaví se po prvním true (optimalizace)
every(predicate):
1. Volá predikát pro každý prvek (zleva doprava)
2. Vrátí TRUE, pokud VŠECHNY prvky vyhovují
3. Vrátí FALSE, pokud ALESPOŇ JEDEN prvek nevyhovuje
4. Zastaví se po prvním false (optimalizace)
Klíčové koncepty
some(predicate)- vracítrue, pokud alespoň jeden prvek splňuje podmínkuevery(predicate)- vracítrue, pokud všechny prvky splňují podmínku- Predikát - funkce:
(element, index, array) => boolean - Early exit - obě metody se zastaví po rozhodnutí (neprochází zbytečně celé pole)
- Prázdné pole -
some([])=false,every([])=true(vacuously true) - Negace -
!some()je ekvivalentevery(!...),!every()jesome(!...)
JavaScript
Příklad 1: some() - existuje alespoň jedno sudé číslo?
const numbers = [1, 3, 5, 8, 9];
const hasEven = numbers.some(function(num) {
return num % 2 === 0;
});
console.log(hasEven);
// → true (8 je sudé)
// Pole bez sudých čísel
const oddOnly = [1, 3, 5, 7];
const hasEven2 = oddOnly.some(num => num % 2 === 0);
console.log(hasEven2);
// → false (žádné sudé číslo)
Co se stalo?
some()prochází pole a hledá první prvek, kde predikát vrátítrue- Zastaví se po nálezu (neprochází celé pole)
- Vrací
true, pokud alespoň jeden prvek vyhovuje - Vrací
false, pokud žádný prvek nevyhovuje
Příklad 2: every() - jsou všechna čísla sudá?
const numbers = [2, 4, 6, 8];
const allEven = numbers.every(num => num % 2 === 0);
console.log(allEven);
// → true (všechna jsou sudá)
// Pole se smíšenými čísly
const mixed = [2, 4, 5, 8];
const allEven2 = mixed.every(num => num % 2 === 0);
console.log(allEven2);
// → false (5 není sudé)
Co se stalo?
every()prochází pole a kontroluje, zda všechny prvky vyhovují- Zastaví se po prvním
false(5 není sudé → konec) - Vrací
true, pokud všechny prvky vyhovují - Vrací
false, pokud alespoň jeden prvek nevyhovuje
Příklad 3: some() a every() s objekty
const users = [
{ name: 'Alice', age: 25, admin: false },
{ name: 'Bob', age: 17, admin: false },
{ name: 'Charlie', age: 30, admin: true }
];
// Existuje alespoň jeden admin?
const hasAdmin = users.some(user => user.admin);
console.log(hasAdmin);
// → true (Charlie je admin)
// Jsou všichni dospělí (18+)?
const allAdults = users.every(user => user.age >= 18);
console.log(allAdults);
// → false (Bob má 17)
// Existuje někdo starší než 40?
const hasOver40 = users.some(user => user.age > 40);
console.log(hasOver40);
// → false (nikdo není starší než 40)
// Mají všichni jméno (ne prázdný string)?
const allHaveNames = users.every(user => user.name.length > 0);
console.log(allHaveNames);
// → true (všichni mají jméno)
Co se stalo?
- Můžeš testovat jakoukoliv vlastnost objektu
some()- "existuje alespoň jeden..."every()- "všichni..."
Příklad 4: Early exit - optimalizace
const numbers = [1, 2, 3, 4, 5];
// some se zastaví po nálezu
const result1 = numbers.some((num, index) => {
console.log(`Checking index ${index}`);
return num > 2;
});
// → Checking index 0
// → Checking index 1
// → Checking index 2
// → (zastaví se - 3 > 2 je true)
console.log(result1); // → true
// every se zastaví po prvním false
const result2 = numbers.every((num, index) => {
console.log(`Checking index ${index}`);
return num < 3;
});
// → Checking index 0
// → Checking index 1
// → Checking index 2
// → (zastaví se - 3 není < 3)
console.log(result2); // → false
Co se stalo?
- Optimalizace: Obě metody se zastaví, jakmile znají odpověď
some()se zastaví po prvnímtrueevery()se zastaví po prvnímfalse- Neprochází zbytečně celé pole
Příklad 5: Prázdné pole - speciální případy
const empty = [];
console.log(empty.some(x => true));
// → false (žádný prvek neexistuje)
console.log(empty.every(x => true));
// → true (vacuously true - "všech 0 prvků splňuje podmínku")
console.log(empty.every(x => false));
// → true (stále vacuously true!)
Co se stalo?
some([])=false- žádný prvek neexistuje, takže nemůže splňovat podmínkuevery([])=true- vacuously true (matematická konvence: prázdná množina splňuje všechny podmínky)- Pozor:
everyna prázdném poli vždy vrátítrue!
Příklad 6: Negace - vztah mezi some a every
const numbers = [1, 2, 3, 4, 5];
// "Existuje alespoň jeden prvek > 3?"
const hasGreater3 = numbers.some(n => n > 3);
console.log(hasGreater3);
// → true
// "Všechny prvky jsou <= 3?"
const allLessOrEqual3 = numbers.every(n => n <= 3);
console.log(allLessOrEqual3);
// → false (některé jsou > 3)
// Negace: !some(x) === every(!x)
console.log(!numbers.some(n => n > 3) === numbers.every(n => n <= 3));
// → true (ekvivalentní)
// Negace: !every(x) === some(!x)
console.log(!numbers.every(n => n > 3) === numbers.some(n => n <= 3));
// → true (ekvivalentní)
Co se stalo?
- De Morgan's laws pro pole:
!some(condition)=every(!condition)!every(condition)=some(!condition)
- Můžeš přepsat negaci
somenaeverya naopak
TypeScript
TypeScript přidává typovou kontrolu predikátu a type guards.
Stejné příklady s typy
// some a every s typy
const numbers: number[] = [1, 2, 3, 4, 5];
const hasEven: boolean = numbers.some(num => num % 2 === 0);
const allEven: boolean = numbers.every(num => num % 2 === 0);
// S objekty
interface User {
name: string;
age: number;
admin: boolean;
}
const users: User[] = [
{ name: 'Alice', age: 25, admin: false },
{ name: 'Bob', age: 30, admin: true }
];
const hasAdmin: boolean = users.some(user => user.admin);
const allAdults: boolean = users.every(user => user.age >= 18);
// Type guard - zúžení typu
type Item = string | number;
const mixed: Item[] = [1, 'a', 2, 'b'];
function isString(x: Item): x is string {
return typeof x === 'string';
}
const hasString: boolean = mixed.some(isString);
const allStrings: boolean = mixed.every(isString);
// Predikát s explicitními typy
const result: boolean = numbers.some((num: number, index: number, arr: number[]): boolean => {
return num > 3;
});
// Chybová kontrola - predikát musí vracet boolean
const invalid = numbers.some(n => n); // ⚠️ Funguje (truthy), ale lépe explicitně boolean
const valid = numbers.some(n => n > 0); // ✅ Explicitně boolean
TypeScript přidává:
- ✅ Typovou kontrolu predikátu - musí vracet boolean (nebo truthy hodnotu)
- ✅ Inference - TypeScript pozná typ prvku automaticky
- ✅ Type guards - můžeš použít
x is Tpro zúžení typu - ✅ Prevenci chyb - chyby odhalíš při psaní
Rozdíl JS vs TS
JavaScript:
- some/every fungují bez typové kontroly
- Predikát může vracet cokoliv (truthy/falsy)
- Flexibilnější, ale nebezpečnější
TypeScript:
- Predikát je typově kontrolovaný
- Lépe dokumentované záměry
- Bezpečnější, prevence chyb
// JavaScript - projde, ale matoucí
const numbers = [1, 2, 3];
const result = numbers.some(n => n); // Vrací truthy hodnotu, ne boolean
// TypeScript - funguje, ale lépe explicitně
const result: boolean = numbers.some(n => n > 0); // Jasný záměr
Tip
💡 some/every místo manuálních smyček:
// ❌ Těžko čitelné - manuální flag
let hasEven = false;
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) {
hasEven = true;
break;
}
}
// ✅ Čitelné - použij some
const hasEven = numbers.some(n => n % 2 === 0);
💡 Využij early exit pro výkon:
// ✅ Efektivní - zastaví se po prvním nálezu
const hasExpensiveCondition = numbers.some(n => expensiveCheck(n));
// ❌ Neefektivní - prochází celé pole
const hasExpensiveCondition = numbers.filter(n => expensiveCheck(n)).length > 0;
💡 Pozor na prázdné pole:
const empty = [];
console.log(empty.some(x => false)); // → false (OK)
console.log(empty.every(x => false)); // → true (POZOR! Vacuously true)
// ✅ Kontroluj délku, pokud to záleží
if (arr.length > 0 && arr.every(x => x > 0)) {
console.log('Všechny prvky jsou kladné');
}
Kvíz
Co vypíše tento kód?
const arr = [2, 4, 6];
const result = arr.every(x => x % 2 === 0) && arr.some(x => x > 5);
console.log(result);
✅ - - arr.every(x => x % 2 === 0) → všechna čísla jsou sudá → true
arr.some(x => x > 5)→ 6 je větší než 5 →truetrue && true→true
❌ - Obě podmínky jsou splněny
❌ - Výsledek je boolean
❌ - Kód je validní
Důležité: Můžeš kombinovat some a every pomocí logických operátorů (&&, ||)!
Důležité: Můžeš kombinovat some a every pomocí logických operátorů (&&, ||)!
🎯 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ě