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