как реорганизовать код JavaScript с помощью функционального программирования - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь научиться функциональному программированию, используя JavaScript из учебника. Я должен рефакторинг некоторого кода, используя функциональное программирование и его трудно. как мне переписать этот код, используя map(), filter() и reduce().

Я должен переписать следующий код более функциональным способом. Я пытался, но продолжаю получать пустые массивы.

const students = [{
    name: "Anna",
    sex: "f",
    grades: [4.5, 3.5, 4]
  },
  {
    name: "Dennis",
    sex: "m",
    country: "Germany",
    grades: [5, 1.5, 4]
  },
  {
    name: "Martha",
    sex: "f",
    grades: [5, 4, 2.5, 3]
  },
  {
    name: "Brock",
    sex: "m",
    grades: [4, 3, 2]
  }
];

// Compute female student results
const femaleStudentsResults = [];
for (const student of students) {
  if (student.sex === "f") {
    let gradesSum = 0;
    for (const grade of student.grades) {
      gradesSum += grade;
    }
    const averageGrade = gradesSum / student.grades.length;
    femaleStudentsResults.push({
      name: student.name,
      avgGrade: averageGrade
    });
  }
}

console.log(femaleStudentsResults);

Результаты должны быть идентичны этому:

[Object{avgGrade: 4, name: 'Anna'}, Object{avgGrade: 3.625, name: 'Martha'}]

Я начал с того, что разделил всех учениц на

const females = students.filter(gender => gender.sex === 'f')

Затем, чтобы вернуть массив оценок, которые я сделал

const grade = females.map(grade => grade.grades);

Но когда я пытаюсь найти среднее для оценок, используя reduce():

 const grade = females
   .map(grade => grade.grades)
   .reduce((accum,curr)=>accum + curr)

Я получаю следующий результат 4.5,3.5,45,4,2.5,3. Как я могу предотвратить это и получить только среднюю оценку за каждого ученика?

1 Ответ

3 голосов
/ 26 апреля 2019

Используйте filter (для получения учениц), а затем .map (для преобразования объекта ученика в объект с avgGrade) вместо:

const students = [{
    name: "Anna",
    sex: "f",
    grades: [4.5, 3.5, 4]
  },
  {
    name: "Dennis",
    sex: "m",
    country: "Germany",
    grades: [5, 1.5, 4]
  },
  {
    name: "Martha",
    sex: "f",
    grades: [5, 4, 2.5, 3]
  },
  {
    name: "Brock",
    sex: "m",
    grades: [4, 3, 2]
  }
];

const sum = (a, b) => a + b;
const femaleStudentsResults = students
  .filter(({ sex }) => sex === 'f')
  .map(({ name, grades }) => ({ name, avgGrade: grades.reduce(sum) / grades.length }));
console.log(femaleStudentsResults);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...