#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. Но, по крайней мере, у вас нет никаких исключений :).