← Lekcje
JavaScript · lekcja 13

Tablice w JavaScript 3/3:
przechodzimy przez wszystkie elementy

Plan tematu (3 godziny):

  1. Godzina 1: czym jest tablica, tworzenie, odczyt elementu, .length
  2. Godzina 2: dopisywanie i zamiana elementów, klucz tekstowy
  3. Godzina 3 (dziś): pętla po wszystkich elementach tablicy
  4. Ćwiczenie: sumowanie liczb i sklejanie tablicy w jeden napis
Rozgrzewka · 3 minuty

Rozgrzewka: tablice z poprzedniej lekcji

  1. Jaką metodą dopiszecie nowy element na końcu tablicy?
  2. Jak znajdziecie indeks danego elementu w tablicy?
  3. Jaka metoda tnie napis na kawałki tablicy według separatora?
Część 1 · Pętla for z indeksem

for: wskaźnik przesuwający się po szufladkach

W PHP foreach ($games as $game) samo przechodziło przez tablicę, bez licznika. W JavaScript zaczynamy od pętli for - jest dłuższa, ale pokazuje dokładnie, co dzieje się pod spodem: licznik i rośnie od 0, dopóki jest mniejszy niż .length.

0jabłko 1gruszka 2banan i = 0 i++ → i = 1 i++ → i = 2 i = 3 → stop 3 < fruits.length (3) jest fałszem
const fruits = ["jabłko", "gruszka", "banan"];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}
// jabłko
// gruszka
// banan
MDN: Learn_web_development/Core/Scripting/Loops (sekcja o pętli for: „for (let i = 0; i < cats.length; i++) { console.log(cats[i]); }”, „In this loop we're starting i at 0, and stopping when i reaches the length of the array”)
Część 2 · Sumowanie elementów

Akumulator: rosnący wynik przy każdym przebiegu

4 8 15 16 23 42 sum=4 sum=12 sum=27 sum=43 sum=66 sum=108 za każdym przebiegiem pętli: sum += numbers[i]
const numbers = [4, 8, 15, 16, 23, 42];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
  sum += numbers[i];
}
console.log(sum);  // 108

sum to akumulator: zmienna, która zbiera wynik po trochu, przebieg po przebiegu. Musi mieć wartość początkową 0 - inaczej dodawanie nie zadziała poprawnie (kolejny slajd).

Część 3 · Pułapka: brak wartości początkowej

Zapomniana wartość startowa: wynik zaczyna się od undefined

let text; (bez wartości) undefined "undefinedjabłkogruszkabanan" let text = ""; (start pusty) "" "jabłkogruszkabanan"
const fruits = ["jabłko", "gruszka", "banan"];
let text;                       // brak wartości = undefined
for (let i = 0; i < fruits.length; i++) {
  text += fruits[i];
}
console.log(text);  // undefinedjabłkogruszkabanan

Zmienna bez wartości ma wartość undefined. Doklejenie napisu do undefined zamienia je w tekst "undefined" - i tak zostaje na początku wyniku. Poprawka: let text = "";

Część 4 · Pętla for...of

for...of: element po elemencie, bez indeksu

jabłko gruszka banan for (const fruit of fruits) fruit = "jabłko" → "gruszka" → "banan" bez licznika i, bez fruits[i]
const fruits = ["jabłko", "gruszka", "banan"];
for (const fruit of fruits) {
  console.log(fruit);
}
// jabłko
// gruszka
// banan

Ten sam wynik co for z indeksem, krótszym zapisem. Przyda się, gdy nie potrzebujecie numeru szufladki, tylko samej wartości.

MDN: Learn_web_development/Core/Scripting/Arrays (sekcja „Accessing every item”: „Very often you will want to access every item in the array. You can do this using the for...of statement”)
Część 5 · Metoda forEach

forEach(): funkcja wywołana dla każdej przegródki

jabłko gruszka banan fn() fn() fn() JavaScript sam wywołuje funkcję raz dla każdego elementu
const fruits = ["jabłko", "gruszka", "banan"];
fruits.forEach(function (fruit) {
  console.log(fruit);
});
// jabłko
// gruszka
// banan

Podajecie forEach() funkcję (jak „maszynkę” z lekcji o funkcjach PHP) - metoda sama wywołuje ją raz dla każdego elementu, przekazując element jako argument.

Ciekawostka z MDN: pętli forEach() nie da się przerwać w środku, tak jak pętli for instrukcją break - jedyny sposób to rzucenie wyjątku. Jeśli trzeba zakończyć przechodzenie po tablicy wcześniej, forEach() jest złym narzędziem do tego zadania, lepiej wrócić do zwykłej pętli for albo for...of.

MDN: Web/JavaScript/Reference/Global_Objects/Array/forEach („The forEach() method of Array instances executes a provided function once for each array element”)
Egzamin E.14

Tak pytają na egzaminie

1.

result = 0;
for (i = 0; i < tab.length; i++) {
  result += tab[i];
}

W języku JavaScript podany w ramce fragment funkcji ma za zadanie

  1. wyświetlić wszystkie elementy tablicy.
  2. policzyć sumę wszystkich elementów tablicy.
  3. dodać do każdego elementu tablicy stałą wartość.
  4. wprowadzić do każdego elementu tablicy aktualną wartość zmiennej i.

2.

var text;
for (var i = 0; i < tab.length; i++) {
  text += tab[i] + "<br>";
}

Którą czynność gwarantującą poprawne wykonanie przedstawionego kodu JavaScript, należy wykonać przed pętlą?

  1. Zadeklarować zmienną i.
  2. Zainicjować zmienną text.
  3. Sprawdzić rozmiar tablicy tab.
  4. Sprawdzić, czy text jest typu znakowego.
CKE, E.14, styczeń 2020, zadanie 33 · CKE, E.14, czerwiec 2017, zadanie 28
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: sumowanie i sklejanie tablicy

  1. Otwórz script.js z poprzednich lekcji (w folderze swojego projektu).
  2. Utwórz const numbers = [4, 8, 15, 16, 23, 42];
  3. Pętlą for zsumuj elementy w akumulatorze sum (pamiętaj o let sum = 0; przed pętlą), wypisz console.log(sum);
  4. Do tablicy fruits z poprzednich lekcji dopisz pętlę for, która sklei wszystkie elementy w jeden napis w zmiennej joined - zacznij od let joined = "";, żeby uniknąć pułapki z undefined.
  5. Wypisz console.log(joined);
  6. Dla chętnych w domu: przepisz pętlę sklejającą na for...of i sprawdź, czy wynik jest taki sam.
Na koniec

Sprawdź się

  1. Czym różni się pętla for od for...of, jeśli chodzi o dostęp do indeksu elementu?
  2. Co się stanie, jeśli zapomnicie nadać zmiennej wartość początkową przed pętlą sumującą lub sklejającą napis?
  3. Jak wywołacie tę samą funkcję dla każdego elementu tablicy bez pisania pętli for ręcznie?

To tyle na dziś - kolejny temat: obiekty w JavaScript.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Pętla for z indeksem, gdy potrzeba tylko wartościfor...of - MDN poleca ją do przechodzenia po każdym elemencie tablicy.zastępowane
Ręczny akumulator sum += numbers[i]reduce() - wykonuje funkcję redukującą na każdym elemencie i zwraca jedną wartość wynikową.rozszerzane
Sklejanie napisu pętlą text += ...array.join(separator) - jedna linia zamiast pętli i ręcznego pilnowania text="".zastępowane
forEach(function(fruit) {...})Tak samo w użyciu - czasem krótszy zapis funkcji, sama metoda bez zmian.nadal w użyciu
MDN: Web/JavaScript/Reference/Global_Objects/Array/reduce („executes a user-supplied reducer callback function on each element of the array... The final result... is a single value”); Learn_web_development/Core/Scripting/Arrays, sekcja „Converting between strings and arrays” (metoda join())