Lekcja 7: Tablice
Tablice (Arrays) to specjalny rodzaj obiektów w JavaScript, służący do przechowywania uporządkowanych kolekcji danych. Elementy w tablicy mogą być różnych typów i są dostępne za pomocą indeksów liczbowych (zaczynając od 0).
Tworzenie tablic
Istnieje kilka sposobów tworzenia tablic:
// 1. Literał tablicowy (najczęstszy sposób)
let pustaTablica = [];
let owoce = ["jabłko", "banan", "pomarańcza"];
let liczby = [1, 2, 3, 4, 5];
let mieszana = ["tekst", 10, true, null];
// 2. Konstruktor Array()
let kolory = new Array("czerwony", "zielony", "niebieski");
let liczby2 = new Array(10); // Tworzy tablicę o długości 10, ale bez elementów (puste sloty)
console.log(owoce);
console.log(liczby2);
console.log(liczby2.length); // 10
Dostęp do elementów
Elementy tablicy są dostępne za pomocą indeksów, zaczynając od 0.
let owoce = ["jabłko", "banan", "pomarańcza"];
console.log(owoce[0]); // "jabłko" (pierwszy element)
console.log(owoce[1]); // "banan" (drugi element)
console.log(owoce[2]); // "pomarańcza" (trzeci element)
console.log(owoce[3]); // undefined (indeks poza zakresem)
// Modyfikacja elementu
owoce[1] = "mango";
console.log(owoce); // ["jabłko", "mango", "pomarańcza"]
Właściwość `length`
Zwraca liczbę elementów w tablicy.
let liczby = [10, 20, 30];
console.log(liczby.length); // 3
// Można również ustawić długość tablicy
liczby.length = 5; // Zwiększa długość, dodając puste sloty
console.log(liczby); // [10, 20, 30, <2 empty items>]
console.log(liczby.length); // 5
liczby.length = 2; // Skraca tablicę, usuwając elementy
console.log(liczby); // [10, 20]
console.log(liczby.length); // 2
Podstawowe metody tablicowe
Tablice w JavaScript mają wiele wbudowanych metod do manipulacji danymi.
Dodawanie/Usuwanie elementów na końcu
push(element1, ..., elementN): Dodaje jeden lub więcej elementów na koniec tablicy i zwraca nową długość.pop(): Usuwa ostatni element z tablicy i zwraca go.
let zwierzeta = ["pies", "kot"];
let nowaDlugosc = zwierzeta.push("chomik", "rybka");
console.log(zwierzeta); // ["pies", "kot", "chomik", "rybka"]
console.log(nowaDlugosc); // 4
let usunietyElement = zwierzeta.pop();
console.log(zwierzeta); // ["pies", "kot", "chomik"]
console.log(usunietyElement); // "rybka"
Dodawanie/Usuwanie elementów na początku
unshift(element1, ..., elementN): Dodaje jeden lub więcej elementów na początek tablicy i zwraca nową długość.shift(): Usuwa pierwszy element z tablicy i zwraca go.
let kolory = ["zielony", "niebieski"];
kolory.unshift("czerwony", "żółty");
console.log(kolory); // ["czerwony", "żółty", "zielony", "niebieski"]
let pierwszyKolor = kolory.shift();
console.log(kolory); // ["żółty", "zielony", "niebieski"]
console.log(pierwszyKolor); // "czerwony"
Łączenie tablic
concat(tablica1, ..., tablicaN): Zwraca nową tablicę, będącą połączeniem bieżącej tablicy z innymi tablicami lub wartościami.
let arr1 = [1, 2];
let arr2 = [3, 4];
let arr3 = [5, 6];
let polaczona = arr1.concat(arr2, arr3, 7);
console.log(polaczona); // [1, 2, 3, 4, 5, 6, 7]
console.log(arr1); // [1, 2] (oryginalna tablica nie jest modyfikowana)
Wycinki tablic
slice(start, end): Zwraca nową tablicę zawierającą kopię fragmentu oryginalnej tablicy od indeksustart(włącznie) do indeksuend(wyłącznie). Nie modyfikuje oryginalnej tablicy.
let litery = ["a", "b", "c", "d", "e"];
let wycinek1 = litery.slice(1, 4); // Elementy od indeksu 1 do 3
console.log(wycinek1); // ["b", "c", "d"]
let wycinek2 = litery.slice(2); // Od indeksu 2 do końca
console.log(wycinek2); // ["c", "d", "e"]
let kopia = litery.slice(); // Kopiuje całą tablicę
console.log(kopia); // ["a", "b", "c", "d", "e"]
console.log(litery); // ["a", "b", "c", "d", "e"] (oryginał bez zmian)
Modyfikacja tablicy w miejscu
splice(start, deleteCount, item1, ..., itemN): Zmienia zawartość tablicy, usuwając lub zastępując istniejące elementy i/lub dodając nowe. Modyfikuje oryginalną tablicę i zwraca tablicę usuniętych elementów.
let miesiace = ["Sty", "Mar", "Kwi", "Maj"];
// Wstawienie elementu na indeksie 1
miesiace.splice(1, 0, "Lut");
console.log(miesiace); // ["Sty", "Lut", "Mar", "Kwi", "Maj"]
// Zastąpienie elementu na indeksie 3
let usuniete = miesiace.splice(3, 1, "Kwiecień");
console.log(miesiace); // ["Sty", "Lut", "Mar", "Kwiecień", "Maj"]
console.log(usuniete); // ["Kwi"]
// Usunięcie dwóch elementów od indeksu 2
miesiace.splice(2, 2);
console.log(miesiace); // ["Sty", "Lut", "Maj"]
Wyszukiwanie elementów
indexOf(element, start): Zwraca pierwszy indeks, pod którym dany element może być znaleziony w tablicy, lub -1, jeśli nie występuje.lastIndexOf(element, start): Zwraca ostatni indeks, pod którym dany element może być znaleziony w tablicy, lub -1.includes(element, start)(ES7): Zwracatrue, jeśli tablica zawiera dany element, w przeciwnym raziefalse.
let liczby = [2, 5, 9, 2];
console.log(liczby.indexOf(2)); // 0 (pierwsze wystąpienie)
console.log(liczby.indexOf(7)); // -1 (nie znaleziono)
console.log(liczby.indexOf(2, 1)); // 3 (szukaj od indeksu 1)
console.log(liczby.lastIndexOf(2)); // 3 (ostatnie wystąpienie)
console.log(liczby.includes(5)); // true
console.log(liczby.includes(1)); // false
Iterowanie po tablicach
Oprócz pętli `for` i `for...of` (omówionych w poprzedniej lekcji), tablice mają wbudowane metody iteracyjne (omówimy je szczegółowo w lekcji o ES6).
forEach(callback(element, index, array)): Wykonuje podaną funkcję raz dla każdego elementu tablicy.
let owoce = ["jabłko", "banan", "mango"];
owoce.forEach(function(owoc, index) {
console.log(`Indeks ${index}: ${owoc}`);
});
// Wynik:
// Indeks 0: jabłko
// Indeks 1: banan
// Indeks 2: mango
Zadanie praktyczne
Stwórz tablicę zawierającą kilka nazw miast. Następnie:
- Dodaj nowe miasto na koniec tablicy.
- Dodaj nowe miasto na początek tablicy.
- Wyświetl drugie miasto z tablicy.
- Usuń ostatnie miasto i wyświetl usuniętą nazwę.
- Wyświetl ostateczną zawartość tablicy i jej długość.
Pokaż rozwiązanie
// 1. Stworzenie tablicy
let miasta = ["Warszawa", "Kraków", "Gdańsk"];
console.log("Początkowa tablica:", miasta);
// 2. Dodanie na koniec
miasta.push("Poznań");
console.log("Po push:", miasta);
// 3. Dodanie na początek
miasta.unshift("Wrocław");
console.log("Po unshift:", miasta);
// 4. Wyświetlenie drugiego miasta
console.log("Drugie miasto:", miasta[1]); // Warszawa
// 5. Usunięcie ostatniego miasta
let usunieteMiasto = miasta.pop();
console.log("Usunięte miasto:", usunieteMiasto); // Poznań
// 6. Ostateczna zawartość i długość
console.log("Ostateczna tablica:", miasta);
console.log("Ostateczna długość:", miasta.length);
Zadanie do samodzielnego wykonania
Dana jest tablica: let dane = [10, "jabłko", true, 25, "banan"];. Użyj pętli `for` lub `forEach` oraz operatora `typeof`, aby wyświetlić w konsoli typ każdego elementu tej tablicy.
FAQ - Tablice
Czy tablice w JavaScript mogą przechowywać elementy różnych typów?
Tak, w przeciwieństwie do niektórych innych języków programowania, tablice w JavaScript są dynamiczne i mogą przechowywać elementy różnych typów danych (liczby, stringi, booleany, obiekty, inne tablice itp.) w tej samej tablicy.
Jaka jest różnica między `slice()` a `splice()`?
slice() zwraca nową tablicę będącą kopią fragmentu oryginalnej tablicy, nie modyfikując jej. splice() modyfikuje oryginalną tablicę, usuwając, zastępując lub dodając elementy, i zwraca tablicę usuniętych elementów.
Jak sprawdzić, czy zmienna jest tablicą?
Operator typeof zwraca "object" dla tablic. Aby poprawnie sprawdzić, czy zmienna jest tablicą, należy użyć metody Array.isArray(zmienna), która zwraca true, jeśli zmienna jest tablicą, i false w przeciwnym razie.
Czy indeksy tablic muszą być liczbami całkowitymi?
Tak, standardowe tablice w JavaScript używają nieujemnych liczb całkowitych jako indeksów (zaczynając od 0). Próba użycia innych wartości jako indeksów (np. stringów) spowoduje traktowanie tablicy jak zwykłego obiektu i dodanie właściwości, a nie elementu tablicowego.
Co to są "rzadkie" tablice (sparse arrays)?
Są to tablice, w których nie wszystkie indeksy od 0 do length - 1 mają przypisane wartości. Mogą powstać np. przez przypisanie wartości do indeksu znacznie większego niż aktualna długość lub przez użycie operatora delete na elemencie. Mogą prowadzić do nieoczekiwanych zachowań w niektórych metodach.
Jak szybko opróżnić tablicę?
Istnieje kilka sposobów. Najprostszy i często najwydajniejszy to przypisanie nowej, pustej tablicy: mojaTablica = []; (działa, jeśli nie ma innych referencji do oryginalnej tablicy). Inny sposób to ustawienie długości na 0: mojaTablica.length = 0; (modyfikuje tablicę w miejscu).