Невозможно получить среднюю оценку, используя уменьшение объекта (JavaScript) - PullRequest
0 голосов
/ 03 ноября 2019

Итак, короче говоря, у меня есть предмет с предметами и оценками студентов. Моя работа заключается в следующем: 1. Рассчитать среднее значение для каждого предмета. 2. Подведите итоги по всем средним;3. Рассчитайте totalAverage по всем предметам.

Вот мой код:

const grades = {
    algebra: [2,3,5,2,4,3],
    geometry: [2,4,5],
    signing: [3,3,4,5],
    physics: [5,5],
    music: [2,2,5],
    english: [4,4,3],
    poetry: [5,3,4],
    chemistry: [2],
    french: [4,4]
  }

function getAverageScore(data) {

for (let subject in data) {
    let grades = data[subject];
    let average = grades.reduce((acc,curr) => {
       return acc + curr / grades.length;

    }, 0)

По какой-то странной причине это не работает, однако, когда я console.log (оценки. длина) показывает длину массива с оценками. Что я делаю неправильно? Кроме того, как я могу суммировать все средние оценки в полученном объекте? Есть предложения?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Вот решение:

function getAverageScore(data) {
  const listOfSubjects = Object.keys(data);
  let averagePerSubject = {};

  let sumOfAllAverages = listOfSubjects.reduce((sumOfAllAverages, subject) => {
    let grades = data[subject];
    let average = grades.reduce((acc,curr) => (acc + curr), 0) / grades.length;

    averagePerSubject[subject] = average;
    return sumOfAllAverages + average;
  }, 0);

  let averageOfAllSubjects = sumOfAllAverages / listOfSubjects.length;

  return { averagePerSubject, sumOfAllAverages, averageOfAllSubjects };
}

Реализация, тем не менее, показывает среднее по всем предметам, а не средневзвешенное значение.

1 голос
/ 03 ноября 2019

Вы можете использовать метод reduce для получения желаемого результата:

const grades = {
    algebra: [2,3,5,2,4,3],
    geometry: [2,4,5],
    signing: [3,3,4,5],
    physics: [5,5],
    music: [2,2,5],
    english: [4,4,3],
    poetry: [5,3,4],
    chemistry: [2],
    french: [4,4]
};

/*
1. Calculate the average for each subject. 
2. Sum up all the averages; 
3. Calculate the totalAverage on all subjects.
*/

const avgBySubject = Object.entries(grades).reduce((a, [k, v]) => {
  a[k] = a[k] || 0;
  a[k] = v.reduce((acc, curr) => {
    acc +=curr;
    return acc;
  } ,0) / v.length;
  return a;
}, {});

console.log(`avg by subject is `, avgBySubject);

const sumAllAverages = Object.values(avgBySubject).reduce((a,c) => {
  a += c || 0;
  return a;
}, 0);

console.log(`sumAllAverages is ${sumAllAverages}`);

const theTotalAverage = sumAllAverages / Object.values(avgBySubject).length;
console.log(`theTotalAverage is: `, theTotalAverage);
0 голосов
/ 03 ноября 2019

Я написал решение для вашей проблемы:

function getAverageScore(data) {
    let sumOfAverages = 0;
    for (let subject in data) {
        const grades = data[subject];
        const sumOfGrades = grades.reduce((acc, curr) => {
            return acc + curr;
        }, 0);
        const averageOfSubject = sumOfGrades / grades.length;
        sumOfAverages += averageOfSubject;
    }
    const totalAverage = sumOfAverages / Object.keys(data).length;
    return totalAverage;
}

Я думаю, что приведенное выше решение является настолько ясным и очевидным.

В вашем коде вы пытались использовать reduce() для вычисления среднего значения вНеправильный путь. Вы делите каждую оценку на количество оценок (даже несколько раз, потому что, когда вы добавляете разделенную оценку к сумме оценок, вы делите ее на следующие итерации функции reduce()).

...