Wpis z mikrobloga

Z tego co się orientuje, to w JS metoda forEach wykonywana na tablicy służy do wyświetlania elementów tej tablicy. Jeżeli mam poniższy fragment kodu:

const usersAge = [20, 21, 22, 23];
usersAge.forEach((age) => {
console.log(W przyszłym roku użytkownik będzie miał ${age + 1} lat);
age++; // NIE ZADZIAŁA i nie zwiększy na stałe każdej wartości z tablicy usersAge o 1
})

to próba zwiększenia każdego elementu tablicy usersAge poprzez inkrementację zmiennej age nie zadziała.

Tyle że teraz wyczytałem na stackoverflow, że można w metodzie forEach użyć drugiego argumentu do uzyskania indeksu elementu pobranego z tablicy. Można wtedy powyższy kod zmodyfikować w następujący sposób:

const usersAge = [20, 21, 22, 23];
usersAge.forEach((age, index) => {
console.log(W przyszłym roku użytkownik będzie miał ${age + 1} lat);
usersAge[index]++; // ZADZIAŁA i zmodyfikuje tablicę usersAge
})

I teraz się zastanawiam, czy jest coś nie tak w drugim fragmencie kodu? W sensie wiem, że to teraz zadziałało, ale nie jestem pewny, czy jest to dobry sposób? I zastanawiam się też nad tym w kontekście używania funkcji strzałkowych, bo gdybym w drugim przykładzie chciał, żeby ta funkcja była uniwersalna i zamiast usersAge[index] napisał this[index], to wtedy to nie zadziała, bo funkcje strzałkowe nie mają wiązania this, więc w takim przypadku to nie zadziała. Czyli w takim przypadku musiałbym użyć tutaj zwykłej funkcji?

Czyli w sumie to są moje dwa pytania:

1. Czy ten sposób na modyfikacje tablicy jest ok, czy można to zrobić lepiej?
2. Jeżeli użyłbym this[index] w drugim fragmencie zamiast usersAge[index] to nie zadziała, bo mamy funkcję strzałkową. Czyli w takim wypadku powinienem tutaj użyć zwykłej funkcji?

I jeszcze jedno, wiem, że do modyfikacji tej tablicy można spokojnie użyć zwykłej pętli for lub while, ale akurat pytam tutaj o użycie metody forEach.

#javascript #webdev #naukaprogramowania
  • 11
via Wykop Mobilny (Android)
  • 0
@maciorqa: możesz zrobić coś takiego że masz funkcje add(numer) {
return numer + 1 } i potem użyć age => console.log(add(age)) tylko że for each nie zwraca niczego więc nie zmieni oryginalnej tablicy
@maciorqa: Twój sposób jest okej. Działa i jest czytelny. Tylko możliwe, że lepszą wydajność miałoby użycie map() i przypisanie efektu do starej zmiennej z tablicą. (Ale trzeba byłoby sprawdzić.)

Ad. 2. Generalnie jak możesz to unikaj this, chociaż jest to opinia. Nie ma sensu zaciemniać sobie kodu.
I teraz się zastanawiam, czy jest coś nie tak w drugim fragmencie kodu? W sensie wiem, że to teraz zadziałało, ale nie jestem pewny, czy jest to dobry sposób?


@maciorqa: Nie, to jest zła praktyka. Zmieniasz coś, po czym jednocześnie iterujesz - brzmi jak przepis na kłopoty, prawda? Wszystko, co możliwe, powinno być niemutowalne. Unikniesz w ten sposób wielu problemów. Pętla też nie jest dobrym rozwiązaniem, bo jest mało czytelna. Pętla
@motokate: Dziękuję bardzo za pomoc, ale mam jeszcze dwa pytania. Napisałaś, że:

Zmieniasz coś, po czym jednocześnie iterujesz - brzmi jak przepis na kłopoty, prawda?


No ale przecież ja w moim przykładzie zmieniłem tę wartość dopiero na koniec pętli, więc ta wartość została już zmieniona i pętla przechodzi do następnego elementu w tablicy. Więc jakie mogą z tego wyniknąć problemy?

Drugie pytanie - wiem, że można też tutaj użyć map, ale
No ale przecież ja w moim przykładzie zmieniłem tę wartość dopiero na koniec pętli, więc ta wartość została już zmieniona i pętla przechodzi do następnego elementu w tablicy. Więc jakie mogą z tego wyniknąć problemy?


@maciorqa: Ale nie zawsze tak będzie, może kiedyś, z jakichś dziwnych powodów, zmieniałbyś inny element. Albo byś się pomylił i zmienił nie pod tym indeksem, pod którym chciałeś. Już sam fakt, że po przejściu forEach coś
@maciorqa: PS. "Premature optimization is the root of all evil". Nie przejmuj się na początku prędkością, zajętością pamięci, tylko skup na jakości kodu. Bądź miły dla przyszłego siebie, który miałby czytać i zrozumieć ten kod pół roku później. Optymalizacją można się zająć, jak zna się podstawy i o ile w ogóle jest jakiś problem z czasem wykonania czy obłożeniem pamięci.