Мне нужно узнать максимальный балл каждого студента из массива их предыдущих баллов - PullRequest
0 голосов
/ 08 ноября 2019

Во-первых, пример того, что мне требуется от моей функции. Массив студентов передается в функцию, и функция возвращает массив с максимальным баллом каждого студента в качестве элементов.

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 сохраняется в оценка .

  4. значение, сохраненное в оценка , добавляется в аккумулятор ( обр. ).

  5. Это значение относится к конкретным учащимсянаивысший балл. Что если есть несколько одинаковых и максимальных баллов? Почему все это не добавляется в накопитель, создавая значение, которое является суммой всех высших баллов для этого человека?

Код работает только с пустым массивом в конце. Я понятия не имею, зачем это нужно. Пожалуйста, объясните это.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Для ваших вопросов, упомянутых в 5-м пункте:

Если есть несколько одинаковых и максимальных оценок, то функция Math.max просто выбирает максимальное значение, и, следовательно, эти значения не добавляются вАккумулятор.

Пустой массив в конце должен передать начальное значение, в которое будет помещен результат сокращения.

0 голосов
/ 08 ноября 2019

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

Теперь, почему вы добавляете это [], работает в вашем примере. Потому что первый аргумент приведения является объектом по умолчанию. Так как в моем примере добавление {} + 0 = 0. Javascript duh!

Но в вашем примере вы помещаете значение в аккумулятор.

arr.push(highestValue)

Идите и откройте консольв вашем браузере и наберите

{}.push(5)

push is not a function

Та же ошибка, что и при запуске функции limit без []. Так что я думаю, что к этому времени вы бы поняли это, передав [], вы явно устанавливаете значение аккумулятора в массив, и теперь

arr.push()

работает

И кстати

Math.max

возвращает только одно наибольшее значение, даже если у вас есть несколько равных значений.

0 голосов
/ 08 ноября 2019

Карта вернет массив массива баллов,

уменьшение будет циклически проходить через ваш массив массива, для каждого элемента (массива баллов) вы выбираете один элемент (самый большой) и нажимаете его нааккумулятор, поэтому ваш аккумулятор может иметь только 1 значение на элемент.

Пустой массив в конце вашего сокращения является начальным значением аккумулятора.

Вы можете достичь того же результата с помощьюэта функция s => s.map(c => Math.max(...c.scores))

...