Pole poskytujà mnoho metod. Pro zjednoduÅ¡enà jsme je v této kapitole rozdÄlili do nÄkolika skupin.
PÅidávánà a odebÃránà prvků
Známe už metody, které pÅidávajà a odebÃrajà prvky na zaÄátku nebo na konci pole:
pole.push(...prvky)â pÅidává prvky na konec,pole.pop()â vybÃrá prvek z konce,pole.shift()â vybÃrá prvek ze zaÄátku,pole.unshift(...prvky)â pÅidává prvky na zaÄátek.
Zde uvedeme nÄkolik dalÅ¡Ãch.
splice
Jak smazat prvek z pole?
Pole jsou objekty, takže se můžeme pokusit použÃt delete:
let pole = ["Já", "jdu", "domů"];
delete pole[1]; // odstranÃme "jdu"
alert( pole[1] ); // undefined
// nynà pole = ["Já", , "domů"];
alert( pole.length ); // 3
Prvek byl odstranÄn, ale pole má stále 3 prvky. VidÃme, že pole.length == 3.
To je pÅirozené, ponÄvadž delete obj.klÃÄ odstraÅuje hodnotu podle klÃÄ. To je vÅ¡e, co udÄlá. Pro objekty je to dobÅe. Ale u polà zpravidla chceme, aby se ostatnà prvky posunuly a obsadily uvolnÄné mÃsto. OÄekáváme, že nynà budeme mÃt kratšà pole.
MÄli bychom tedy použÃt speciálnà metody.
Metoda pole.splice je jako Å¡výcarský nůž pro pole. Umà vÅ¡echno: vkládat, odstraÅovat i nahrazovat prvky.
Syntaxe je:
pole.splice(zaÄátek[, poÄetSmazaných, prvek1, ..., prvekN])
Modifikuje pole od indexu zaÄátek: napÅed odstranà poÄetSmazaných prvků a pak vložà na jejich mÃsto prvek1, ..., prvekN. Vrátà pole odstranÄných prvků.
Tato metoda je snadno pochopitelná na pÅÃkladech.
ZaÄnÄme s mazánÃm:
let pole = ["Já", "studuji", "JavaScript"];
pole.splice(1, 1); // od indexu 1 odstranÃme 1 prvek
alert( pole ); // ["Já", "JavaScript"]
Snadné, že? PoÄÃnajÃc indexem 1 metoda odstranila 1 prvek.
V dalÅ¡Ãm pÅÃkladu odstranÃme 3 prvky a nahradÃme je dvÄma jinými:
let pole = ["Já", "studuji", "JavaScript", "právÄ", "teÄ"];
// odstranÃme prvnà 3 prvky a nahradÃme je dvÄma jinými
pole.splice(0, 3, "Zatancujme", "si");
alert( pole ) // nynà ["Zatancujme", "si", "právÄ", "teÄ"]
Zde vidÃme, že splice vracà pole odstranÄných prvků:
let pole = ["Já", "studuji", "JavaScript", "právÄ", "teÄ"];
// odstranÃme prvnà 2 prvky
let odstranÄno = pole.splice(0, 2);
alert( odstranÄno ); // "Já", "studuji" <-- pole odstranÄných prvků
Metoda splice dokáže také vkládat prvky bez odstraÅovánÃ. Toho dosáhneme tak, že nastavÃme poÄetSmazaných na 0:
let pole = ["Já", "studuji", "JavaScript"];
// od indexu 2
// smažeme 0 prvků
// pak vložÃme "složitý" a "jazyk"
pole.splice(2, 0, "složitý", "jazyk");
alert( pole ); // "Já", "studuji", "složitý", "jazyk", "JavaScript"
Zde i v jiných metodách polà jsou povoleny záporné indexy. Ty specifikujà pozici od konce pole, napÅÃklad:
let pole = [1, 2, 5];
// od indexu -1 (jeden krok pÅed koncem)
// smažeme 0 prvků,
// pak vložÃme 3 a 4
pole.splice(-1, 0, 3, 4);
alert( pole ); // 1,2,3,4,5
slice
Metoda pole.slice je mnohem jednoduššà než podobnÄ vypadajÃcà pole.splice.
Syntaxe je:
pole.slice([zaÄátek], [konec])
Vrátà nové pole, do nÄhož zkopÃruje vÅ¡echny prvky od indexu zaÄátek do indexu konec (konec nenà zahrnut). Jak zaÄátek, tak konec mohou být záporné. V tom pÅÃpadÄ se pozice poÄÃtá od konce pole.
Podobá se ÅetÄzcové metodÄ str.slice, ale mÃsto podÅetÄzců vytváÅà podpole.
NapÅÃklad:
let pole = ["t", "e", "s", "t"];
alert( pole.slice(1, 3) ); // e,s (kopÃruje od 1 do 3)
alert( pole.slice(-2) ); // s,t (kopÃruje od -2 do konce)
Můžeme ji volat i bez argumentů: pole.slice() vytvoÅà kopii pole. To se Äasto použÃvá k vytvoÅenà kopie pole pro dalšà transformace, které nemajà ovlivnit původnà pole.
concat
Metoda pole.concat vytvoÅà nové pole, které obsahuje hodnoty z jiných polà a dalšà prvky.
Syntaxe je:
pole.concat(arg1, arg2...)
PÅijÃmá libovolný poÄet argumentů â mohou jimi být pole nebo hodnoty.
Výsledkem je nové pole, které obsahuje prvky z pole, pak arg1, arg2 atd.
Je-li argument argN pole, pak se zkopÃrujà vÅ¡echny jeho prvky. V opaÄném pÅÃpadÄ se zkopÃruje sám argument.
PÅÃklad:
let pole = [1, 2];
// vytvoÅÃme pole z: pole a [3,4]
alert( pole.concat([3, 4]) ); // 1,2,3,4
// vytvoÅÃme pole z: pole a [3,4] a [5,6]
alert( pole.concat([3, 4], [5, 6]) ); // 1,2,3,4,5,6
// vytvoÅÃme pole z: pole a [3,4], pak pÅidáme hodnoty 5 a 6
alert( pole.concat([3, 4], 5, 6) ); // 1,2,3,4,5,6
BÄžnÄ kopÃruje prvky jen z polÃ. Ostatnà objekty, i ty, které vypadajà jako pole, se pÅidajà jako celek:
let pole = [1, 2];
let jakoPole = {
0: "nÄco",
length: 1
};
alert( pole.concat(jakoPole) ); // 1,2,[object Object]
â¦Jestliže vÅ¡ak objekt podobný poli má speciálnà vlastnost Symbol.isConcatSpreadable, pak s nÃm metoda concat zacházà jako s polem â mÃsto objektu se pÅidajà jeho prvky:
let pole = [1, 2];
let jakoPole = {
0: "nÄco",
1: "jiného",
[Symbol.isConcatSpreadable]: true,
length: 2
};
alert( pole.concat(jakoPole) ); // 1,2,nÄco,jiného
Iterace: forEach
Metoda pole.forEach umožÅuje pro každý prvek pole volat zadanou funkci.
Syntaxe:
pole.forEach(function(prvek, index, pole) {
// ... provádà nÄco s prvkem
});
NapÅÃklad tohle zobrazà každý prvek pole:
// pro každý prvek volá alert
["Bilbo", "Gandalf", "Nazgúl"].forEach(alert);
A tento kód podrobnÄ vypÃÅ¡e pozice prvků v cÃlovém poli:
["Bilbo", "Gandalf", "Nazgúl"].forEach((prvek, index, pole) => {
alert(`${prvek} je na indexu ${index} v poli ${pole}`);
});
Pokud funkce vrátà nÄjaký výsledek, je zahozen a ignorován.
Hledánà v poli
UveÄme nynà metody, které prohledávajà pole.
indexOf/lastIndexOf a includes
Metody pole.indexOf a pole.includes majà podobnou syntaxi a dÄlajà v zásadÄ totéž, jako jejich ÅetÄzcové protÄjÅ¡ky, ale mÃsto znaků pracujà nad prvky pole:
pole.indexOf(prvek, odkud)â hledáprvekpoÄÃnajÃc indexemodkuda vrátà index, na nÄmž byl prvek nalezen, anebo-1, když nalezen nebyl.pole.includes(prvek, odkud)â hledáprvekpoÄÃnajÃc indexemodkuda vrátÃtrue, pokud byl nalezen.
Tyto metody se obvykle použÃvajà jen s jednÃm argumentem: tÃm je prvek, který se má hledat. StandardnÄ se hledá od zaÄátku pole.
PÅÃklad:
let pole = [1, 0, false];
alert( pole.indexOf(0) ); // 1
alert( pole.indexOf(false) ); // 2
alert( pole.indexOf(null) ); // -1
alert( pole.includes(1) ); // true
ProsÃme vÅ¡imnÄte si, že metoda indexOf použÃvá striktnà porovnávánà ===. Hledáme-li tedy false, najde pÅesnÄ false a ne nulu.
Pokud chceme jen ovÄÅit, zda prvek je obsažen v poli, a nepotÅebujeme jeho index, dává se pÅednost metodÄ pole.includes.
Metoda pole.lastIndexOf je totéž jako indexOf, ale hledá zprava doleva.
let ovoce = ['Jablko', 'PomeranÄ', 'Jablko']
alert( ovoce.indexOf('Jablko') ); // 0 (prvnà Jablko)
alert( ovoce.lastIndexOf('Jablko') ); // 2 (poslednà Jablko)
includes zpracovává správnÄ NaNDrobný, ale pozoruhodný rozdÃl metody includes je také v tom, že na rozdÃl od indexOf správnÄ zpracovává NaN:
const pole = [NaN];
alert( pole.indexOf(NaN) ); // -1 (mÄlo by být 0, ale rovnost === pro NaN nefunguje)
alert( pole.includes(NaN) ); // true (správnÄ)
Je to proto, že metoda includes byla do JavaScriptu pÅidána mnohem pozdÄji a vnitÅnÄ použÃvá aktuálnÄjšà porovnávacà algoritmus.
find a findIndex/findLastIndex
PÅedstavme si, že máme pole objektů. Jak najdeme objekt, pro který platà specifická podmÃnka?
Tady se nám hodà metoda pole.find(fn).
Syntaxe je:
let výsledek = pole.find(function(prvek, index, pole) {
// jestliže funkce vrátà true, bude vrácen prvek a iterace se zastavÃ
// pokud funkce vrátà samá false, bude vráceno undefined
});
Funkce je volána na prvcÃch pole postupnÄ na jednom za druhým:
prvekje prvek.indexje jeho index.poleje samotné pole.
Jestliže vrátà true, hledánà se zastavà a vrátà se prvek. NenÃ-li nic nalezeno, vrátà se undefined.
NapÅÃklad máme pole uživatelů, každý má vlastnosti id a jméno. NajdÄme toho, který má id == 1:
let uživatelé = [
{id: 1, jméno: "Jan"},
{id: 2, jméno: "Petr"},
{id: 3, jméno: "Marie"}
];
let uživatel = uživatelé.find(prvek => prvek.id == 1);
alert(uživatel.jméno); // Jan
V reálném životÄ se pole objektů bÄžnÄ použÃvajÃ, takže metoda find je velmi užiteÄná.
VÅ¡imnÄte si, že v tomto pÅÃkladu poskytujeme metodÄ find funkci prvek => prvek.id == 1 s jednÃm argumentem. To je typické, ostatnà argumenty této funkce se použÃvajà málokdy.
Metoda pole.findIndex má stejnou syntaxi, ale namÃsto samotného prvku vracà index, na nÄmž byl prvek nalezen. Jestliže nebylo nalezeno nic, vrátà hodnotu -1.
Metoda pole.findLastIndex je podobná metodÄ findIndex, ale hledá zprava doleva, podobnÄ jako lastIndexOf.
PÅÃklad:
let uživatelé = [
{id: 1, jméno: "Jan"},
{id: 2, jméno: "Petr"},
{id: 3, jméno: "Marie"},
{id: 4, jméno: "Jan"}
];
// Najde index prvnÃho Jana
alert(uživatelé.findIndex(uživatel => uživatel.jméno == 'Jan')); // 0
// Najde index poslednÃho Jana
alert(uživatelé.findLastIndex(uživatel => uživatel.jméno == 'Jan')); // 3
filter
Metoda find najde jediný (prvnÃ) prvek, který způsobÃ, že funkce vrátà true.
Jestliže takových prvků může být vÃce, můžeme použÃt metodu pole.filter(fn).
Jejà syntaxe je podobná find, ale filter vracà pole vÅ¡ech odpovÃdajÃcÃch prvků:
let výsledky = pole.filter(function(prvek, index, pole) {
// vrátÃ-li true, prvek se vložà metodou push do výsledků a iterace pokraÄuje
// nenÃ-li nic nalezeno, je vráceno prázdné pole
});
PÅÃklad:
let uživatelé = [
{id: 1, jméno: "Jan"},
{id: 2, jméno: "Petr"},
{id: 3, jméno: "Marie"}
];
// vrátà pole prvnÃch dvou uživatelů
let nÄjacÃUživatelé = uživatelé.filter(prvek => prvek.id < 3);
alert(nÄjacÃUživatelé.length); // 2
Transformace polÃ
PÅejdÄme nynà k metodám, které pole transformujà a pÅeskupujÃ.
map
Metoda pole.map je jedna z nejužiteÄnÄjÅ¡Ãch a nejÄastÄji použÃvaných.
Volá zadanou funkci pro každý prvek pole a vracà pole výsledků.
Syntaxe je:
let výsledek = pole.map(function(prvek, index, pole) {
// vrátà novou hodnotu mÃsto prvku
});
NapÅÃklad zde pÅetransformujeme každý prvek na jeho délku:
let délky = ["Bilbo", "Gandalf", "Nazgúl"].map(prvek => prvek.length);
alert(délky); // 5,7,6
sort(fn)
Volánà metody pole.sort() seÅadà pole uvnitÅ a zmÄnà poÅadà jeho prvků.
Vracà také seÅazené pole, ale návratová hodnota se obvykle ignoruje, jelikož je modifikováno samotné pole.
PÅÃklad:
let pole = [ 1, 2, 15 ];
// metoda pÅeházà obsah pole
pole.sort();
alert( pole ); // 1, 15, 2
VÅ¡imli jste si na výstupu nÄÄeho divného?
SeÅazené pole je 1, 15, 2. To nenà správnÄ. Ale proÄ?
Prvky jsou standardnÄ Åazeny jako ÅetÄzce.
VÅ¡echny prvky bez výjimky se pÅi porovnávánà pÅevádÄjà na ÅetÄzce. Pro ÅetÄzce se použije lexikografické Åazenà a skuteÄnÄ "2" > "15".
Abychom použili naÅ¡e vlastnà ÅazenÃ, musÃme jako argument pole.sort() poskytnout funkci.
Tato funkce by mÄla porovnávat dvÄ libovolné hodnoty a vracet:
function porovnej(a, b) {
if (a > b) return 1; // je-li prvnà hodnota vÄtšà než druhá
if (a == b) return 0; // jsou-li si hodnoty rovny
if (a < b) return -1; // je-li prvnà hodnota menšà než druhá
}
NapÅÃklad když ÅadÃme ÄÃsla:
function porovnejÄÃsla(a, b) {
if (a > b) return 1;
if (a == b) return 0;
if (a < b) return -1;
}
let pole = [ 1, 2, 15 ];
pole.sort(porovnejÄÃsla);
alert(pole); // 1, 2, 15
Nynà to funguje tak, jak jsme zamýšleli.
UdÄlejme nynà krok stranou a zamysleme se nad tÃm, co se dÄje. pole může obsahovat cokoli, že? Může obsahovat ÄÃsla, ÅetÄzce, objekty, zkrátka cokoli. Máme sadu nÄjakých prvků. Abychom ji seÅadili, potÅebujeme Åadicà funkci, která umà jejà prvky porovnat. Standardnà Åazenà je ÅetÄzcové.
Metoda pole.sort(fn) implementuje generický algoritmus ÅazenÃ. NemusÃme se zajÃmat o to, jak vnitÅnÄ funguje (vÄtÅ¡inou je to optimalizované rychlé Åazenà (quicksort) nebo Timsort). Projde pole, porovná jeho prvky poskytnutou funkcà a seÅadà je. VÅ¡e, co potÅebujeme, je poskytnout funkci fn, která provede porovnánÃ.
Mimochodem, jestliže chceme vÄdÄt, které prvky se porovnávajà â nic nám nebránà je zobrazit:
[1, -2, 15, 2, 0, 8].sort(function(a, b) {
alert( a + " <> " + b );
return a - b;
});
Algoritmus může v tomto procesu porovnat jeden prvek s nÄkolika jinými, ale snažà se uÄinit co nejménÄ porovnánÃ.
Ve skuteÄnosti se od porovnávacà funkce vyžaduje jen to, aby vrátila kladné ÄÃslo, když ÅÃká âvÄtÅ¡Ãâ, a záporné, když ÅÃká âmenÅ¡Ãâ.
To nám umožÅuje psát kratšà funkce:
let pole = [ 1, 2, 15 ];
pole.sort(function(a, b) { return a - b; });
alert(pole); // 1, 2, 15
VzpomÃnáte si na Å¡ipkové funkce? Můžeme je zde použÃt, aby kód Åazenà byl úhlednÄjÅ¡Ã:
pole.sort( (a, b) => a - b );
Funguje to pÅesnÄ stejnÄ jako výše uvedená delšà verze.
localeCompareVzpomÃnáte si na porovnávacà algoritmus pro ÅetÄzce? StandardnÄ porovnává pÃsmena podle jejich kódů.
Pro mnoho abeced je lepšà použÃvat metodu ÅetÄzec.localeCompare, která seÅadà správnÄ pÃsmena, napÅ. Ä.
NapÅÃklad seÅaÄme nÄkolik států v ÄeÅ¡tinÄ:
let státy = ['Äesko', 'Andorra', 'Vietnam'];
alert( státy.sort( (a, b) => a > b ? 1 : -1) ); // Andorra, Vietnam, Äesko (Å¡patnÄ)
alert( státy.sort( (a, b) => a.localeCompare(b) ) ); // Andorra, Äesko, Vietnam (správnÄ!)
reverse
Metoda pole.reverse pÅevrátà poÅadà prvků pole.
PÅÃklad:
let pole = [1, 2, 3, 4, 5];
pole.reverse();
alert( pole ); // 5,4,3,2,1
I ona vracà pÅevrácené pole.
split a join
Máme zde situaci z bÄžného života. PÃÅ¡eme aplikaci pro posÃlánà zpráv a uživatel zadá seznam pÅÃjemců oddÄlených Äárkou: Jan, Petr, Marie. Pro nás by vÅ¡ak bylo daleko pohodlnÄjšà mÃt pole jmen než jediný ÅetÄzec. Jak je zÃskat?
PÅesnÄ tohle dÄlá metoda ÅetÄzec.split(oddÄlovaÄ), která rozdÄlà ÅetÄzec na pole podle zadaného oddÄlovaÄe oddÄlovaÄ.
V nÞe uvedeném pÅÃkladu oddÄlujeme Äárkou, po nÞ následuje mezera:
let jména = 'Bilbo, Gandalf, Nazgúl';
let pole = jména.split(', ');
for (let jméno of pole) {
alert( `Zpráva pro ${jméno}.` ); // Zpráva pro Bilbo (a dalšà jména)
}
Metoda split má nepovinný druhý ÄÃselný argument â limit délky pole. Pokud je uveden, pak se po dosaženà tohoto limitu dalšà prvky ignorujÃ. V praxi se vÅ¡ak použÃvá jen zÅÃdka:
let pole = 'Bilbo, Gandalf, Nazgúl, Saruman'.split(', ', 2);
alert(pole); // Bilbo, Gandalf
Volánà split(s) s prázdným s rozdÄlà ÅetÄzec na pole pÃsmen:
let ÅetÄzec = "test";
alert( ÅetÄzec.split('') ); // t,e,s,t
Metoda pole.join(spojka) provádà opak metody split. VytvoÅà ÅetÄzec z prvků pole, které budou mezi sebou spojeny ÅetÄzcem spojka.
PÅÃklad:
let pole = ['Bilbo', 'Gandalf', 'Nazgúl'];
let ÅetÄzec = pole.join(';'); // spojÃme pole do ÅetÄzce pomocà ;
alert( ÅetÄzec ); // Bilbo;Gandalf;Nazgúl
reduce/reduceRight
Když potÅebujeme procházet prvky pole â můžeme použÃt forEach, for nebo for..of.
Když potÅebujeme procházet prvky a pro každý prvek vrátit nÄjaká data â můžeme použÃt map.
Do této skupiny patÅà i metody pole.reduce a pole.reduceRight, ale ty jsou trochu záludnÄjÅ¡Ã. PoužÃvajà se k výpoÄtu jediné hodnoty závisejÃcà na poli.
Syntaxe je:
let hodnota = pole.reduce(function(akumulátor, prvek, index, pole) {
// ...
}, [poÄáteÄnÃHodnota]);
Funkce se volá postupnÄ na vÅ¡ech prvcÃch pole a svůj výsledek âpÅenášÃâ do dalÅ¡Ãho volánÃ.
Argumenty:
akumulátorâ výsledek pÅedchozÃho volánà funkce, napoprvé se rovnápoÄáteÄnÃHodnota(je-lipoÄáteÄnÃHodnotauvedena).prvekâ je aktuálnà prvek pole.indexâ je jeho pozice.poleâ je pole.
Poté, co je funkce provedena, se výsledek pÅedchozÃho volánà funkce pÅedá jako prvnà argument v dalÅ¡Ãm volánÃ.
Prvnà argument je tedy v podstatÄ akumulátor, do nÄhož se ukládá kombinovaný výsledek ze vÅ¡ech pÅedchozÃch volánÃ. Nakonec se stane výsledkem funkce reduce.
Znà to složitÄ?
Nejjednoduššà způsob, jak to pochopit, je pÅÃklad.
Zde zÃskáme souÄet celého pole na jediném Åádku:
let pole = [1, 2, 3, 4, 5];
let výsledek = pole.reduce((souÄet, aktuálnÃ) => souÄet + aktuálnÃ, 0);
alert(výsledek); // 15
Funkce pÅedaná do reduce použÃvá jen 2 argumenty, to zpravidla staÄÃ.
PodÃvejme se na podrobnosti toho, co se dÄje.
- PÅi prvnÃm průbÄhu je
souÄetroven hodnotÄpoÄáteÄnÃHodnota(poslednà argumentreduce), tedy0, aaktuálnÃje prvnà prvek pole, tedy1. Výsledek funkce je tedy1. - PÅi druhém průbÄhu
souÄet = 1, pÅiÄteme k nÄmu druhý prvek pole (2) a vrátÃme výsledek. - PÅi tÅetÃm průbÄhu
souÄet = 3, pÅiÄteme k nÄmu dalšà prvek, a tak dáleâ¦
PrůbÄh výpoÄtu:
Nebo ve formÄ tabulky, v nÞ každý Åádek pÅedstavuje volánà funkce na dalÅ¡Ãm prvku pole:
souÄet |
aktuálnà |
výsledek | |
|---|---|---|---|
| prvnà volánà | 0 |
1 |
1 |
| druhé volánà | 1 |
2 |
3 |
| tÅetà volánà | 3 |
3 |
6 |
| Ätvrté volánà | 6 |
4 |
10 |
| páté volánà | 10 |
5 |
15 |
Tady jasnÄ vidÃme, jak se výsledek pÅedchozÃho volánà stává prvnÃm argumentem následujÃcÃho.
Můžeme také vypustit poÄáteÄnà hodnotu:
let pole = [1, 2, 3, 4, 5];
// z reduce je odstranÄna poÄáteÄnà hodnota (žádná 0)
let výsledek = pole.reduce((souÄet, aktuálnÃ) => souÄet + aktuálnÃ);
alert( výsledek ); // 15
Výsledek je stejný. Je to proto, že nenÃ-li uvedena poÄáteÄnà hodnota, reduce vezme jako poÄáteÄnà hodnotu prvnà prvek pole a zahájà iteraci až od druhého.
VýpoÄetnà tabulka je stejná jako výše uvedená, jen bez prvnÃho Åádku.
Takové použità vÅ¡ak vyžaduje extrémnà pozornost. Je-li pole prázdné, pak volánà reduce bez poÄáteÄnà hodnoty ohlásà chybu.
PÅÃklad:
let pole = [];
// Chyba: Reduce of empty array with no initial value
// kdyby poÄáteÄnà hodnota existovala, reduce by pro prázdné pole vrátila ji.
pole.reduce((souÄet, aktuálnÃ) => souÄet + aktuálnÃ);
DoporuÄuje se tedy poÄáteÄnà hodnotu vždy uvádÄt.
Metoda pole.reduceRight dÄlá totéž, ale postupuje zprava doleva.
Array.isArray
Pole netvoÅà samostatný jazykový typ, ale jsou založena na objektech.
Proto typeof nedokáže rozlišit planý objekt od pole:
alert(typeof {}); // object
alert(typeof []); // object (totéž)
â¦Pole se vÅ¡ak použÃvajà natolik Äasto, že pro nÄ existuje speciálnà metoda: Array.isArray(hodnota). Vrátà true, jestliže hodnota je pole, a false jinak.
alert(Array.isArray({})); // false
alert(Array.isArray([])); // true
VÄtÅ¡ina metod podporuje âthisArgâ
TémÄÅ vÅ¡echny metody polÃ, které volajà funkce â napÅ. find, filter, map, s významnou výjimkou metody sort, pÅijÃmajà nepovinný dalšà parametr thisArg.
Tento parametr nebyl vysvÄtlen ve výše uvedených podkapitolách, protože se použÃvá jen zÅÃdka. Ale pro úplnost jej musÃme uvést.
Zde je úplná syntaxe tÄchto metod:
pole.find(funkce, thisArg);
pole.filter(funkce, thisArg);
pole.map(funkce, thisArg);
// ...
// thisArg je nepovinný poslednà argument
Hodnota parametru thisArg se ve funkci funkce stane this.
NapÅÃklad zde použijeme metodu objektu armáda jako filtr a thisArg pÅedá kontext:
let armáda = {
minVÄk: 18,
maxVÄk: 27,
můžeVstoupit(uživatel) {
return uživatel.vÄk >= this.minVÄk && uživatel.vÄk < this.maxVÄk;
}
};
let uživatelé = [
{vÄk: 16},
{vÄk: 20},
{vÄk: 23},
{vÄk: 30}
];
// najdeme uživatele, pro které armáda.můžeVstoupit vrátà true
let vojáci = uživatelé.filter(armáda.můžeVstoupit, armáda);
alert(vojáci.length); // 2
alert(vojáci[0].vÄk); // 20
alert(vojáci[1].vÄk); // 23
Kdybychom v uvedeném pÅÃkladu použili uživatelé.filter(armáda.můžeVstoupit), pak by armáda.můžeVstoupit byla volána jako samostatná funkce, v nÞ by bylo this=undefined, což by okamžitÄ vedlo k chybÄ.
Volánà uživatelé.filter(armáda.můžeVstoupit, armáda) můžeme nahradit za uživatelé.filter(uživatel => armáda.můžeVstoupit(uživatel)), které by udÄlalo totéž. Tato varianta se použÃvá ÄastÄji, jelikož pro vÄtÅ¡inu lidà je trochu srozumitelnÄjÅ¡Ã.
ShrnutÃ
PÅehled metod polÃ:
-
Pro pÅidávánà a odebÃránà prvků:
push(...prvky)â pÅidá prvky na konec.pop()â vyjme prvek z konce.shift()â vyjme prvek ze zaÄátku.unshift(...prvky)â pÅidá prvky na zaÄátek.splice(pozice, poÄetSmazaných, ...prvky)â na indexupozicesmažepoÄetSmazanýchprvků a vložÃprvky.slice(zaÄátek, konec)â vytvoÅà nové pole, zkopÃruje do nÄj prvky od indexuzaÄátekdo indexukonec(kromÄ nÄj).concat(...prvky)â vrátà nové pole: zkopÃruje vÅ¡echny prvky z aktuálnÃho pole a pÅidá do nÄjprvky. Je-li kterýmkoli prvkem zprvkypole, pak se mÃsto nÄj pÅidajà jeho prvky.
-
Pro hledánà mezi prvky:
indexOf/lastIndexOf(prvek, pozice)â hledáprvekpoÄÃnajÃc pozicÃpozice, vrátà jeho index nebo-1, pokud nenà nalezen.includes(hodnota)â jestliže pole obsahuje hodnotuhodnota, vrátÃtrue, jinak vrátÃfalse.find/filter(funkce)â filtruje prvky podle zadané funkce, vrátà prvnà hodnotu/vÅ¡echny hodnoty, na nÞ/nichž funkce vrátilatrue.findIndexje jakofind, ale namÃsto hodnoty vrátà index.
-
Pro procházenà prvků:
forEach(funkce)â voláfunkcepro každý prvek, nic nevracÃ.
-
Pro transformaci pole:
map(funkce)â vytvoÅà nové pole z výsledků volánÃfunkcepro každý prvek.sort(funkce)â seÅadà prvky uvnitÅ pole, pak toto pole vrátÃ.reverse()â pÅevrátà poÅadà prvků uvnitÅ pole, pak toto pole vrátÃ.split/joinâ pÅevádà ÅetÄzec na pole a zpÄt.reduce/reduceRight(funkce, poÄáteÄnÃHodnota)â vypoÄÃtá z pole jedinou hodnotu tak, že voláfunkcepro každý prvek a pÅedává mezivýsledek mezi volánÃmi.
-
OstatnÃ:
Array.isArray(hodnota)ovÄÅÃ, zdahodnotaje pole. Pokud ano, vrátÃtrue, jinak vrátÃfalse.
ProsÃme vÅ¡imnÄte si, že metody sort, reverse a splice modifikujà samotné pole.
Tyto metody jsou nejpoužÃvanÄjšà a v 99% pÅÃpadů dostaÄujÃ. Existuje vÅ¡ak i nÄkolik dalÅ¡Ãch:
-
pole.some(fn)/pole.every(fn) provÄÅÃ pole.
Na každém prvku pole je volána funkce
fn, podobnÄ jako u funkcemap. Jestliže nÄkterý výsledek je/vÅ¡echny výsledky jsoutrue, vrátÃtrue, jinak vrátÃfalse.Tyto metody se chovajà obdobnÄ jako operátory
||a&&: jestližefnvrátà pravdivou hodnotu,pole.some()okamžitÄ vrátÃtruea zastavà procházenà zbývajÃcÃch prvků; jestližefnvrátà nepravdivou hodnotu,pole.every()okamžitÄ vrátÃfalsea rovnÄž zastavà procházenà zbývajÃcÃch prvků.PomocÃ
everymůžeme porovnávat pole:function poleSeRovnajÃ(pole1, pole2) { return pole1.length === pole2.length && pole1.every((hodnota, index) => hodnota === pole2[index]); } alert( poleSeRovnajÃ([1, 2], [1, 2])); // true -
pole.fill(hodnota, zaÄátek, konec) â vyplnà pole opakujÃcà se hodnotou
hodnotaod indexuzaÄátekdo indexukonec. -
pole.copyWithin(cÃl, zaÄátek, konec) â zkopÃruje prvky pole od pozice
zaÄátekdo pozicekonecdo téhož pole na pozicicÃl(existujÃcà prvky pÅepÃÅ¡e). -
pole.flat(hloubka)/pole.flatMap(fn) vytvoÅà nové jednorozmÄrné pole z vÃcerozmÄrného.
Pro úplný seznam nahlédnÄte do manuálu.
Na prvnà pohled se může zdát, že je tady spousta metod a je tÄžké si je pamatovat. Ve skuteÄnosti je to vÅ¡ak mnohem snazÅ¡Ã.
ProjdÄte si pÅehled metod, abyste o nich vÄdÄli. Pak vyÅeÅ¡te úlohy v této kapitole, abyste se pocviÄili. Tak zÃskáte s metodami polà zkuÅ¡enosti.
Když pozdÄji budete potÅebovat udÄlat nÄco s polem a nebudete vÄdÄt jak â pÅijÄte sem, podÃvejte se do pÅehledu a najdÄte správnou metodu. PÅÃklady vám pomohou napsat ji správnÄ. Brzy si budete metody automaticky pamatovat, aniž by vás to stálo nÄjakou zvláštnà námahu.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)