javascript - 使用 filter() 而不是 map() 来修改对象数组?

我最近开始通过教育类(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)
    }));
}

https://stackoverflow.com/questions/67236522/

相关文章:

dart - 在 Dart 中,给定可空类型 `T?` ,我如何获得不可空类型 `T`

python - 导入错误 : No module named 'typing' when tryi

azure - 如何删除被不属于我的域锁定的 Front Door 资源

reactjs - "Redundant alt attribute. Screen-readers

python - 在合并和排序函数中列出超出范围的索引

asp.net-core - 如何在 ASP.NET Core 3.1 中为 Swagger 指定默

javascript - 尝试调试 javascript : "vscode listen eacc

perl - 什么意思 "Can' t locate object method.."在这个使用 P

r - 使用 gsub() 从 R 中的数组中提取数字

r - 使向量的所有元素都不同