我需要从他们以前的分数列表中找出每个学生的最高分数

时间:2019-11-08 13:16:51

标签: javascript arrays reduce

首先,举例说明我对功能的要求。一个学生数组被传递给该函数,该函数返回一个数组,其中每个学生的最高分作为项目。

getStudentTopScores([
  {
    id: 1,
    name: "Jacek",
    scores: [5, 3, 4, 2, 5, 5]
  },
  {
    id: 2,
    name: "Ewa",
    scores: [2, 3, 3, 3, 2, 5]
  },
  {
    id: 3,
    name: "Zygmunt",
    scores: [2, 2, 4, 4, 3, 3]
  }
]) ➞ [5, 5, 4]

以下是我的工作职能。我需要一些帮助来解释其工作原理。

const getStudentTopScores=students=>
    students
    .map(student=>student.scores)
    .reduce((arr,scores)=>{
      const score = scores.length?Math.max(...scores):0;
      arr.push(score);
      return arr;
    },[]);

那么,我的代码怎么了?

  1. 一系列学生被传递到函数 getStudentTopScores
  2. .map()方法应用于数组:

    .map(student => student.scores) 我认为这是访问存储在学生内部的分数数组。

  3. .reduce()方法应用于每个得分。这将获取每个分数并询问:此分数是数组中的最高分数吗?。如果答案为是,则该值存储在分数中(如果答案为否)。 ,那么0将存储在得分中。

    1. 得分中存储的值将添加到累加器( arr )。

    2. 该值是特定学生的最高分数。 如果多个分数相等且最高怎么办?为什么不将这些全部添加到累加器中,创建一个值,该值是该个人所有最高得分的总和?

该代码仅在末尾使用空数组。我不知道为什么需要这样做。请对此进行解释。

3 个答案:

答案 0 :(得分:0)

地图将返回一个分数数组,

reduce将遍历数组数组,对于每个项目(一个分数数组),您选择一个元素(最大)并将其推入累加器,因此您的累加器每个元素只能有1个值。

reduce末尾的空数组是累加器的起始值。

您可以使用此功能获得相同的结果 s => s.map(c => Math.max(...c.scores))

答案 1 :(得分:0)

对于第五点中提到的问题:

如果有多个相等且最大的分数,则Math.max函数仅获取最大值,因此这些值不会添加到累加器中。

最后一个空数组将传递一个初始值,reduce的结果将被推入该初始值。

答案 2 :(得分:0)

Reduce函数可以循环数组中的每个对象,并将每次迭代的值存储到累加器对象,这是通过在迭代中返回值来实现的。

基本示例为

[1,2,3,4].reduce((accumulator, value) => {
  return accumulator + value
})
// outputs 10

现在看这个例子

[1,2,3,4].reduce((accumulator, value) => {
  return accumulator + value
}, 20)
// now the output 30, because the initial value of accumulator is set to 20
// so 20 + 1 + 2 + 3 + 4 = 30

现在在您的示例中为什么要添加[]。 因为默认情况下reduce的第一个参数是object。 因为在我的示例中添加了{} + 0 =0。所以Javascript duh!

但是在您的示例中,您正在将值推入累加器。

arr.push(highestValue)

继续,在浏览器中打开控制台,然后输入

{}.push(5)

push is not a function

在不使用[]的情况下运行reduce函数时将遇到的相同错误。 因此,我认为这一次您应该已经知道了,通过传递[],您可以将累加器值显式设置为array,而现在

arr.push()

有效

还有顺便说一句

Math.max

即使有多个相等的值,也只返回一个最大值。