javascript - 如何使用函数式编程重构 javascript 代码

标签 javascript functional-programming

我正在尝试通过一本教科书来学习使用 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);

结果必须与此相同:

[对象{avgGrade: 4,名称:'安娜'},对象{avgGrade: 3.625,名称:'玛莎'}]

我首先将所有女学生分开

const Females = Students.filter(gender => sex.sex === 'f')

然后,返回我的成绩数组

constgrade=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。我怎样才能防止这种情况并只获得每个学生的平均成绩平均值?

最佳答案

使用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);

关于javascript - 如何使用函数式编程重构 javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55874574/

相关文章:

java - java 8 中 lambda 表达式的副作用

javascript - Django如何识别Django实现的多语言网页的语言变化?

javascript - 在 JAR 中包含 minify maven 插件的输出

python - 透明地将数字类型处理为单值序列(反之亦然)

haskell - $ 和 () 的区别

javascript - 回调、高阶函数、回调队列有什么区别

javascript - img onload 在 IE7 中效果不佳

javascript - 比较 SharePoint 列表中的两个 int 列

javascript - 通过 API post 请求将数十万个 JSON 对象发送到数据库

java - 数组的不可变数据结构替换