Problem przy przypisaniu do obiektu metody liczącą średnią

Problem przy przypisaniu do obiektu metody liczącą średnią
Principissa
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:1
0

Mam napisany fragment kodu, ale mam problemy kiedy próbuje dopisać fragment dzięki któremu nie będzie wyświetlać mi się jedynie tabela z ocenami i średnia ale również imię, nazwisko i identyfikator. Czy ktoś byłby wstanie mi wyjaśnić jak to poprawnie zrobić?

const student = [{
name: 'Sophia',
surname:'Gilbert',
identifier: 'x00',
grades: [5, 4, 5],
}];
var average;
for (let i = 0; i < student.length; i++){
var grades = student[i]["grades"];
var total = 0;
console.log(grades);
for (var j = 0; j < grades.length; j++ ) {
total += grades[j];
}
average = total / grades.length;
}
console.log(average)

  • 0.png (28 KB) - ściągnięć: 81
Tasmanian Devil
"Twój post prawdopodobnie zawiera niesformatowany kod - nie wklejaj bezpośrednio kodu, ale obejmuj go w odpowiednie znaczniki! (jestem botem, ten komentarz został dodany automatycznie)"
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 godzin
  • Postów:8423
1

Musisz łapać te dane w pętli - np. zamiast console.logować na końcu, to możesz console.logować w środku pętli. Wtedy będziesz mieć dostęp do tych danych.

Z drugiej strony wrzucanie console.log do środka pętli jest mało eleganckie, więc mogłabyś zrobić podzielić to na 2 części:

  • obliczanie średniej dla wszystkich użytkowników (I zrobić np. osobną tablicę averages z zapisaną średnią dla każdego użytkownika)
  • samo wyświetlanie wcześniej obliczonych danych (i wyświetlić każdy element tej tablicy razem z odpowiadającym nazwiskiem itp.)

I teraz. Nie musisz używać pętli for. JS ma specjalną konstrukcję do tworzenia jednej tablicy z drugiej, czyli metodę map, która przyjmuje funkcję, która będzie wywołana dla każdego elementu i wtedy możesz zmapować każdy element np. na średnią (czyli map zamiast jednej pętli for). Z kolei żeby policzyć sumę ocen do średniej, też nie musisz robić pętli, bo masz reduce. Czyli możesz zrobić coś takiego:

Kopiuj
const averages = student.map(s => s.grades.reduce((a, b) => a + b) / s.grades.length)
for (let i = 0; i < student.length; i++) {
    console.log(student[i].name, averages[i]);
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

A do tego kodu, który już masz

Kopiuj
for (let i = 0; i < student.length; i++){
  var grades = student[i]["grades"];

var ma zasięg na całą funkcję (a nie na blok), jeśli chcesz zrobić zmienną, która będzie widoczna tylko w pętli, to lepiej użyć const albo let. Inaczej mogą być niespodzianki.


edytowany 3x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.