• 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ą

Object Storage Arubacloud
0 głosów
4,076 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,510 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 341 wizyt
pytanie zadane 11 listopada 2018 w Python przez adam11 Użytkownik (570 p.)

92,568 zapytań

141,420 odpowiedzi

319,624 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...