【问题标题】:I need to find out each student's top score from an array of their previous scores我需要从他们以前的分数数组中找出每个学生的最高分
【发布时间】:2020-03-05 03:09:15
【问题描述】:

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

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) 我认为这是访问存储在学生内部的 scores 数组。

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

    1. score 中存储的值被添加到累加器 (arr)。

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

该代码仅适用于最后的空数组。我不知道为什么需要这样做。请解释一下。

【问题讨论】:

  • 是关于reduce中的[]的问题吗?是累加器的intialValue

标签: javascript arrays reduce


【解决方案1】:

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

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

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

你可以用这个函数达到同样的效果 s => s.map(c => Math.max(...c.scores))

【讨论】:

    【解决方案2】:

    对于您在第 5 点中提到的问题:

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

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

    【讨论】:

      【解决方案3】:

      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 函数时会遇到同样的错误。 所以我想到这个时候你会明白的,通过传递 [] 你明确地将累加器值设置为数组,现在

      arr.push()
      

      作品

      顺便说一句

      Math.max
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 2022-11-18
        • 2016-09-19
        • 1970-01-01
        相关资源
        最近更新 更多