• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

funkcja przyjmująca tablicę jako argument i zwracająca tablicę, w której każdy element jest pomniejszony o średnią

42 Warsaw Coding Academy
0 głosów
4,577 wizyt
pytanie zadane 13 lutego 2017 w JavaScript przez svyatogor92 Użytkownik (670 p.)

Witam, mam polecenie:

Napisz funkcję distFromAvarage, która ma przyjmować tylko jeden argument – tablicę. Funkcja ta ma zwracać też tablicę. Zwracana tablica powinna mieć w sobie różnicę pomiędzy liczbą z danej komórki a średnią wartością tablicy. 

napisałem coś takiego:

var average = 0;
var result = 0;
var distAverage = 0;
function distFromAverage(array) {
  for(i = 0; i < array.length; i++) {
    result = result + array[i];
    average = result/array.length;
    distAverage = array[i] - average;
  }
  console.log(distAverage);
}
distFromAverage([2,2,2,2]);

Niestety jednak tablica zwraca pojedyńczy element [i] pomniejszony o średnią, a nie całą tablicę z każdym elementem minus średnia całości.

Co zrobiłem źle?

komentarz 13 lutego 2017 przez ScriptyChris Mędrzec (190,190 p.)

Zapoznaj się z Array.reduce()

2 odpowiedzi

0 głosów
odpowiedź 13 lutego 2017 przez svyatogor92 Użytkownik (670 p.)

Z koleżeńską pomocą wpadłem na coś takiego:

var one = 0;
var average = 0;
function distFromAvarage (array) {
  var sum = 0;
  for (var i=0; i<array.length; i++) {
    sum = (sum +array[i]);
    average = sum/array.length;
  } for (var j=0; j<array.length; j++) {
      array[j] = array[j] - average;
  } console.log(array);
}
distFromAvarage([2,4,6]);

Jednakże zastanawiam się czy dałoby się wykonać to zadanie bez pętli zagnieżdżonych tak jak na początku mojej wypowiedzi?

komentarz 13 lutego 2017 przez ScriptyChris Mędrzec (190,190 p.)

Twoje pętle nie są zagnieżdżone - druga (iterator j) występuje po pierwszej (iterator i). Czyli trochę bez sensu, bo obie iterują po tej samej tablicy. Przy czym w drugiej iterujesz od zera - można to na pewno skrócić.

0 głosów
odpowiedź 13 lutego 2017 przez Tomek Sochacki Ekspert (227,490 p.)

Można tą funkcję nieco skrócić, np. do postaci:

function distFromAvarage (arr) {
  	var average = arr.reduce((a,b) => a+b) / arr.length;
	console.log(arr.map(v => v - average));
}

distFromAvarage ([2,4,6]); // [-2, 0, 2]

Kilka uwag do zastosowanych metod:

reduce(): w tym wypadku po prostu dodaje kolejno wszystkie wartości tablicy i zwraca całkowitą sumę

map(): przelatuje przez wszystkie elementy tablicy i modyfikuje każdy z nich. Metoda map() nie modyfikuje oryginalnej tablicy, lecz zwraca nową, przetworzoną tablicę.

Ponad to, jeśli nie byłoby to zadanie typowo szkolne (gdzie pewnie masz jakieś z góry narzucone warunki brzegowe) polecałbym rozszerzyć funkcję o sprawdzenie czy na pewno arr to tablica zawierająca liczby, lub elementy dające się zrzutować na liczbę (jeśli dopuszczamy taką możliwość) i w razie złych danych wejściowych zgłosić wyjątek lub podać odpowiedni komunikat w konsoli.

Jeszcze taka mała dygresja związana z Twoim kodem:

unikaj stosowania zmiennych globalnych - w Twoim wypadku praktycznie wszystkie zmienne to zmienne globalne, a powinny być zmiennymi w zakresie funkcji. Dotyczy to również zmiennej "i" stosowanej w pętli, gdyż przy braku jawnej deklaracji przez var, let lub const zmienna wylatuje właśnie do zakresu globalnego, czyli np. obiektu window jeśli mówimy o przeglądarce (bo np. w nodeJS sprawa jest nieco bardziej skomplikowana). Ponad to lepiej jest stosować jedną deklarację, np. "var" dla wszystkich zmiennych:

var one = 0,        //tutaj przecinek
    average = 0; //za ostatnią deklarowaną zmienną średnik

 

Podobne pytania

0 głosów
2 odpowiedzi 627 wizyt
pytanie zadane 11 listopada 2018 w Python przez adam11 Użytkownik (570 p.)

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,727 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...