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

标签 javascript

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

相关文章:

javascript - 如何在 jQuery 中使用 jquery 变量?

javascript - 鼠标悬停、鼠标悬停并单击谷歌地图上的同一标记

javascript - setInterval 对象方法仅运行一次

javascript - 原型(prototype)中定义的变量在对象之间共享?

javascript - swfobject.embedSWF 在 iOS 中不工作

javascript - 我正在使用两个 onready() 处理程序创建然后隐藏一个 jquery 时间条目,它会导致 IE7 和 Firefox 中出现严重错误

javascript - 修复了滚动时页面顶部的对象

javascript - 检查 javascript 中是否存在变量;不起作用

javascript - JavaScript 中的序数字符串比较?

JavaScript - Puppeteer 超时等于零的含义和行为