04.08 Find a findIndex
Výuka
Proč Find a findIndex?
find() a findIndex() slouží k vyhledávání prvku v poli podle podmínky. find() vrací prvek samotný, findIndex() vrací jeho index.
Proč to potřebujeme?
- Hledání prvku - Najdi první uživatel s daným jménem
- Ověření existence - Existuje v poli prvek splňující podmínku?
- Pozice prvku - Na jakém indexu je prvek?
- Komplexní podmínky -
indexOffunguje jen s primitivy,finds objekty
Představ si to jako: Hledání knih v knihovně. find() ti dá knihu samotnou ("Tady je ta kniha o JavaScriptu"). findIndex() ti řekne, kde je ("Je na police 5, pozice 12").
Jak to funguje?
find(predicate):
1. Volá predikát pro každý prvek (zleva doprava)
2. Vrátí PRVNÍ prvek, kde predikát vrátil true
3. Pokud nic nenajde, vrátí undefined
4. Zastaví se po prvním nálezu (neprochází celé pole)
findIndex(predicate):
1. Volá predikát pro každý prvek (zleva doprava)
2. Vrátí INDEX prvního prvku, kde predikát vrátil true
3. Pokud nic nenajde, vrátí -1
4. Zastaví se po prvním nálezu
Klíčové koncepty
find(predicate)- vrací první prvek splňující podmínku (neboundefined)findIndex(predicate)- vrací index prvního prvku (nebo-1)- Predikát - funkce:
(element, index, array) => boolean - Zastaví se po nálezu - efektivnější než
filter(neprochází celé pole) - undefined vs -1 -
findvracíundefined,findIndexvrací-1při nenalezení - Složité podmínky - funguje s objekty, na rozdíl od
indexOf
JavaScript
Příklad 1: find() - najdi první sudé číslo
const numbers = [1, 3, 5, 8, 10, 12];
const firstEven = numbers.find(function(num) {
return num % 2 === 0;
});
console.log(firstEven);
// → 8 (první sudé číslo)
// Pokud nic nenajde
const numbers2 = [1, 3, 5, 7];
const notFound = numbers2.find(num => num % 2 === 0);
console.log(notFound);
// → undefined (žádné sudé číslo)
Co se stalo?
find()prochází pole zleva doprava- Zastaví se, když predikát vrátí
true - Vrátí prvek samotný (8, ne index!)
- Pokud nic nenajde, vrátí
undefined
Příklad 2: findIndex() - najdi index prvního sudého čísla
const numbers = [1, 3, 5, 8, 10, 12];
const index = numbers.findIndex(num => num % 2 === 0);
console.log(index);
// → 3 (8 je na indexu 3)
console.log(numbers[index]);
// → 8 (můžeš použít index k získání prvku)
// Pokud nic nenajde
const numbers2 = [1, 3, 5, 7];
const notFound = numbers2.findIndex(num => num % 2 === 0);
console.log(notFound);
// → -1 (nenalezeno)
Co se stalo?
findIndex()vrací index prvního vyhovujícího prvku- Pokud nic nenajde, vrátí
-1(stejně jakoindexOf) - Můžeš použít index k přístupu k prvku:
numbers[index]
Příklad 3: Hledání v poli objektů
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 35 }
];
// Najdi uživatele s id 2
const user = users.find(u => u.id === 2);
console.log(user);
// → { id: 2, name: 'Bob', age: 30 }
// Najdi index uživatele jménem Charlie
const index = users.findIndex(u => u.name === 'Charlie');
console.log(index);
// → 2
// Ověř, zda existuje uživatel starší než 40
const over40 = users.find(u => u.age > 40);
console.log(over40);
// → undefined (žádný uživatel nesplňuje podmínku)
Co se stalo?
- find funguje skvěle s objekty (na rozdíl od
indexOf) - Můžeš hledat podle libovolné vlastnosti:
id,name,age - Vrací celý objekt (nebo
undefined)
Příklad 4: Porovnání find vs filter
const numbers = [1, 2, 3, 4, 5, 6];
// find - vrátí PRVNÍ sudé číslo
const firstEven = numbers.find(n => n % 2 === 0);
console.log(firstEven);
// → 2
// filter - vrátí VŠECHNA sudá čísla
const allEven = numbers.filter(n => n % 2 === 0);
console.log(allEven);
// → [2, 4, 6]
Co se stalo?
- find - najde první vyhovující prvek a zastaví se
- filter - najde všechny vyhovující prvky
- find je rychlejší, pokud potřebuješ jen první prvek
Příklad 5: find s indexem a polem (všechny parametry)
const arr = ['a', 'b', 'c', 'd', 'e'];
// Najdi prvek na sudém indexu
const result = arr.find((element, index, array) => {
console.log(`Checking ${element} at index ${index}`);
return index % 2 === 0;
});
// → Checking a at index 0
// → (zastaví se - index 0 je sudý)
console.log(result);
// → a
Co se stalo?
- Predikát má 3 parametry:
element- aktuální prvekindex- index prvkuarray- celé pole (zřídka se používá)
findse zastaví po prvním nálezu (neprochází celé pole)
Příklad 6: indexOf vs findIndex
const numbers = [10, 20, 30, 40];
// indexOf - hledá přesnou shodu
const index1 = numbers.indexOf(30);
console.log(index1);
// → 2
// findIndex - hledá podle podmínky
const index2 = numbers.findIndex(n => n > 25);
console.log(index2);
// → 2 (první číslo > 25 je 30 na indexu 2)
// indexOf s objekty - NEFUNGUJE
const users = [{ name: 'Alice' }, { name: 'Bob' }];
const index3 = users.indexOf({ name: 'Bob' });
console.log(index3);
// → -1 (nenašlo - porovnává reference, ne obsah!)
// findIndex s objekty - FUNGUJE
const index4 = users.findIndex(u => u.name === 'Bob');
console.log(index4);
// → 1 (našlo podle vlastnosti)
Co se stalo?
- indexOf - hledá přesnou shodu (pomocí
===) - findIndex - hledá podle podmínky (flexibilnější)
- indexOf nefunguje s objekty (porovnává reference)
- findIndex funguje (porovnává vlastnosti)
TypeScript
TypeScript přidává typovou kontrolu predikátu a type guards pro zúžení typu.
Stejné příklady s typy
// find s typy
const numbers: number[] = [1, 3, 5, 8, 10];
const firstEven: number | undefined = numbers.find(num => num % 2 === 0);
// TypeScript ví, že výsledek může být undefined
if (firstEven !== undefined) {
console.log(firstEven * 2); // ✅ OK - ověřeno, že není undefined
}
// findIndex vrací number (ale může být -1!)
const index: number = numbers.findIndex(num => num % 2 === 0);
// Hledání v poli objektů
interface User {
id: number;
name: string;
age: number;
}
const users: User[] = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
const user: User | undefined = users.find(u => u.id === 2);
// Type guard - zúžení typu
type Item = { type: 'food'; name: string } | { type: 'tool'; name: string };
const items: Item[] = [
{ type: 'food', name: 'apple' },
{ type: 'tool', name: 'hammer' }
];
function isFood(item: Item): item is { type: 'food'; name: string } {
return item.type === 'food';
}
const food = items.find(isFood); // food má zúžený typ!
// Generická utility funkce
function findById<T extends { id: number }>(arr: T[], id: number): T | undefined {
return arr.find(item => item.id === id);
}
const foundUser = findById(users, 2); // User | undefined
TypeScript přidává:
- ✅ Správný návratový typ -
T | undefinedprofind,numberprofindIndex - ✅ Type guards - zúží typ výsledku
- ✅ IntelliSense - editor ti napovídá vlastnosti
- ✅ Prevenci chyb - musíš ověřit
undefinedpřed použitím
Rozdíl JS vs TS
JavaScript:
- find/findIndex fungují bez typové kontroly
- Můžeš zapomenout ověřit
undefined - Žádná type safety
- Flexibilnější, ale nebezpečnější
TypeScript:
- Návratový typ je
T | undefined - TypeScript tě upozorní, pokud neověříš
undefined - Type guards zužují typ
- Bezpečnější, prevence runtime chyb
// JavaScript - může způsobit runtime error
const users = [{ name: 'Alice' }];
const user = users.find(u => u.name === 'Bob');
console.log(user.name); // Runtime error! user je undefined
// TypeScript - upozorní tě
const users: User[] = [{ name: 'Alice' }];
const user: User | undefined = users.find(u => u.name === 'Bob');
console.log(user.name); // ❌ Error: Object is possibly 'undefined'
// Musíš ověřit
if (user) {
console.log(user.name); // ✅ OK
}
Tip
💡 Vždy ověřuj undefined před použitím find:
const user = users.find(u => u.id === 123);
// ❌ Nebezpečné - user může být undefined
console.log(user.name); // Runtime error!
// ✅ Bezpečné - ověř nejdřív
if (user) {
console.log(user.name);
} else {
console.log('Uživatel nenalezen');
}
// ✅ Nebo použij optional chaining (ES2020+)
console.log(user?.name); // undefined pokud user není
💡 find vs findIndex - kdy použít co:
// ✅ Používej find, pokud potřebuješ prvek
const user = users.find(u => u.id === 2);
console.log(user.name);
// ✅ Používej findIndex, pokud potřebuješ index
const index = users.findIndex(u => u.id === 2);
users[index] = newUser; // Nahraď prvek
// ✅ Používej findIndex pro ověření existence
const exists = users.findIndex(u => u.id === 2) !== -1;
💡 find je efektivnější než filter pro jeden prvek:
// ❌ Neefektivní - filter prochází celé pole
const user = users.filter(u => u.id === 2)[0]; // Projde všechny prvky!
// ✅ Efektivní - find se zastaví po nálezu
const user = users.find(u => u.id === 2); // Zastaví se po nálezu
Kvíz
Co vypíše tento kód?
const arr = [1, 2, 3, 4, 5];
const result = arr.find(x => x > 10);
console.log(result === undefined);
✅ - find() hledá prvek větší než 10. Žádný prvek nesplňuje podmínku, takže find() vrátí undefined. undefined === undefined je true
❌ - Výsledek je undefined, ne nějaká hodnota
❌ - find() vrací undefined při nenalezení, ne -1 (to vrací findIndex!)
❌ - Není to chyba, kód je validní
Důležité:
find()vracíundefinedkdyž nic nenajdefindIndex()vrací-1když nic nenajde- Nespleť si je!
Důležité:
find()vracíundefinedkdyž nic nenajdefindIndex()vrací-1když nic nenajde- Nespleť si je!
🎯 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ě