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

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

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

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

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

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

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).

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:

  1. Dodaj nowe miasto na koniec tablicy.
  2. Dodaj nowe miasto na początek tablicy.
  3. Wyświetl drugie miasto z tablicy.
  4. Usuń ostatnie miasto i wyświetl usuniętą nazwę.
  5. 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).