我最近开始通过教育类(class)学习 javascript。关于 filter() 和 map() 之间的区别,我有一个非常简单的问题。我得到了一个学生对象列表,每个对象都包含姓名、性别和一系列成绩,我被要求返回一个女学生列表,其中包含她们的姓名、性别和平均成绩。 (链接:https://www.educative.io/courses/the-complete-javascript-course-build-a-real-world-app-from-scratch/qVlyoEpxYEk)
输入是:
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]
}
];
预期的输出是:
[ { name: 'Anna', sex: 'f', grades: 4 },
{ name: 'Martha', sex: 'f', grades: 3.625 } ]
给出的解决方案如下。除了最后一行,我什么都懂。为什么我们使用 filter() 而不是 map() 将 avgGrade 应用于女学生数组?我认为 filter() 应该只返回满足函数中指定条件的数组元素。
另外,为什么使用 filter(students,femaleList).map(avgGrade) 不起作用?
function studentResult(students) {
const femaleList = student => student.sex === "f";
const avgGrade = arr => arr.grades = arr.grades.reduce((a,b) => a + b, 0) / arr.grades.length;
const filter = (student, func) => student.filter(func);
const result = filter(filter(students,femaleList),avgGrade);
return result;
}
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]
}
];
function studentResult(students) {
const femaleList = student => student.sex === "f";
const avgGrade = arr => arr.grades = arr.grades.reduce((a,b) => a + b, 0) / arr.grades.length;
const filter = (student, func) => student.filter(func);
const result = filter(filter(students,femaleList),avgGrade);
return result;
}
console.log(studentResult(students));
最佳答案
那个代码真的很差。过滤器函数不需要限定范围,而且它是以一种故意混淆的方式编写的。如果我找到写那个的开发者,我会和他/她说句话。
编辑:重新阅读帖子,我不敢相信这段代码是用来教人们 JS 的。好吧,一旦你想通了,OP,确保你永远不要在工作中写这样的东西。
仅供引用,它应该是一个filter
,然后是一个map
- 您首先过滤以仅获取女学生,然后映射到平均成绩:
function averageGrade(grades) {
return grades.reduce((acc,g) => acc+g,0)/grades.length
}
function studentResult(students) {
return students
// get only the female students
.filter(student => student.sex === 'f')
// compute the average grade
.map(student => ({
...student,
grades: averageGrade(student.grades)
}));
}
关于javascript - 使用 filter() 而不是 map() 来修改对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67236522/