Tablice w JavaScript 3/3: przechodzimy przez wszystkie elementy
Plan tematu (3 godziny):
Godzina 1: czym jest tablica, tworzenie, odczyt elementu, .length
Godzina 2: dopisywanie i zamiana elementów, klucz tekstowy
Godzina 3 (dziś): pętla po wszystkich elementach tablicy
Ćwiczenie: sumowanie liczb i sklejanie tablicy w jeden napis
Rozgrzewka · 3 minuty
Rozgrzewka: tablice z poprzedniej lekcji
Jaką metodą dopiszecie nowy element na końcu tablicy?
Jak znajdziecie indeks danego elementu w tablicy?
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.
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
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
const fruits = ["jabłko", "gruszka", "banan"];
let text; // brak wartości = undefinedfor (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
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”)
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
wyświetlić wszystkie elementy tablicy.
policzyć sumę wszystkich elementów tablicy.
dodać do każdego elementu tablicy stałą wartość.
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ą?
Zadeklarować zmienną i.
Zainicjować zmienną text.
Sprawdzić rozmiar tablicy tab.
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
Otwórz script.js z poprzednich lekcji (w folderze swojego projektu).
Utwórz const numbers = [4, 8, 15, 16, 23, 42];
Pętlą for zsumuj elementy w akumulatorze sum (pamiętaj o let sum = 0; przed pętlą), wypisz console.log(sum);
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.
Wypisz console.log(joined);
Dla chętnych w domu: przepisz pętlę sklejającą na for...of i sprawdź, czy wynik jest taki sam.
Na koniec
Sprawdź się
Czym różni się pętla for od for...of, jeśli chodzi o dostęp do indeksu elementu?
Co się stanie, jeśli zapomnicie nadać zmiennej wartość początkową przed pętlą sumującą lub sklejającą napis?
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 lekcji
W produkcji
Status
Pętla for z indeksem, gdy potrzeba tylko wartości
for...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())