Что означает этот синтаксис в методе array.reduce()?

#javascript #functional-programming

#javascript #функциональное программирование

Вопрос:

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

 const numArr = [1,2,3,4,5,6,7,8,9,10];

const average = (array) => array.reduce((a, b) => (a   b), 0) / array.length;

Result => 5.5
  

Часть, которая кажется необязательной, — это «, 0» в конце перед «)/».

Любой ввод был бы высоко оценен.

Комментарии:

1. a является аккумулятором. Это значение, которое нужно добавить к итогу. b является ли currentValue — 0 передается здесь как значение по умолчанию. Взгляните на сигнатуру метода для уменьшения . Попробуйте это с пустым массивом и без него.

2. Это необязательное начальное значение. Причина та же, потому что в этом случае вычисление суммы массива, если вы начинаете с нуля, происходит так же, как если бы вы начинали с первого значения в массиве.

3. Вы правы , 0) необязательно, когда оно есть, оно используется в качестве начального значения, и если не первый вызов reduce имеет 1 и 2 элемента в массиве. Это было бы необходимо, если у вас есть подобный код [{x:1},{x:2},{x:3}].reduce((a,b) => a b.x, 0)

4. @Lewis отличное спасибо. спасибо всем.

Ответ №1:

Метод Javascript array.reduce принимает 2 параметра, первый — это функция обратного вызова, второй — это начальное значение, которое будет передано функции обратного вызова в качестве первого начального значения, если нам нужно передать другое значение, и это optional так. Если он не определен, в качестве начального значения используется первый элемент. Для получения дополнительной информации посмотрите этот Javascript array reduce

Ответ №2:

Показанную average функцию можно разделить на две части, из которых только первая часть имеет отношение к ответу на вопрос.

Первая часть создает сумму всех чисел внутри массива:

 array.reduce((a, b) => (a   b), 0)
  

Действительно, часть , 0) в конце здесь не нужна, потому что reduce либо ожидает начального значения (здесь 0 ), либо оно начинается с первого элемента внутри массива в качестве начального значения. Лично я думаю, что добавление , 0) части немного проясняет, что такое отступ: сложите все числа, начиная с нуля.

Если посмотреть на строку, то внутри функции reducer есть ненужный оператор группировки. Поэтому его можно переписать следующим образом:

 array.reduce((a, b) => a   b, 0)
  

Или, если у вас есть add функция (например const add = (a, b) => a b ):

 array.reduce(add, 0)
  

Без начального значения мы получаем кратчайшую форму:

 array.reduce(add)
  

Ответ №3:

Здесь 0 указано начальное значение или какое-то время также известно накопителю ass. Итак, в функции обратного вызова reduce начальное значение a аргумента будет установлено равным 5 . В этой демонстрации вместо 0 передается 5 и проверьте первый журнал. Он будет печатать 5 . Итак, что бы вы ни передавали, это будет начальное значение a . Второй журнал будет initial value first element in the array , то есть 5 1=6 . Теперь начальное значение изменится на 6, а третий журнал будет 6 2=8 и так далее

 const numArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const average = (array) => array.reduce((a, b) => {
  console.log(a)
  return (a   b);
}, 5) / array.length;

console.log(average(numArr))  

Ответ №4:

Для этого давайте сначала разберемся с функцией reducer:

 Arr.reduce((accumulator, currentValue) => (/* do something with the parameters */), initialValue);
  

Здесь:

накопитель: накопитель накапливает возвращаемые значения обратного вызова

currentValue: текущий элемент, обрабатываемый в массиве.

initialValue: Значение, используемое в качестве первого аргумента при первом вызове обратного вызова.

При первом вызове обратного вызова accumulator и currentValue может иметь одно из двух значений. Если initialValue это предусмотрено при вызове reduce() , то накопитель будет равен initialValue , а currentValue будет равен первому значению в массиве. Если не initialValue указано, то accumulator будет равно первому значению в массиве, а currentValue будет равно второму.

Вы можете прочитать больше здесь, в документации от MDN

Ответ №5:

Согласно документации Mozilla, второй параметр является начальным значением:

 arr.reduce(callback[, initialValue])
  

Чтобы ответить на ваш вопрос: зачем это требуется?

Требуется учитывать массивы нулевой длины и избегать исключений. Если вы опустите второй параметр, если в вашем массиве будет ноль элементов, вы получите исключение, как показано ниже:

 const numArr = [];

const average = (array) => array.reduce((a, b) => (a   b)) / array.length;

console.log(average(numArr));  

С другой стороны, если вы добавите начальное значение:

 const numArr = [];

const average = (array) => array.reduce((a, b) => (a   b), 0) / array.length;

console.log(average(numArr));  

В этом случае вы получаете NaN , потому что в итоге вы бы получили 0 / 0 , что приводит к NaN в JavaScript. Но, по крайней мере, у вас нет никаких исключений :).