Что означает этот синтаксис в методе array.reduce ()? - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю через функциональную библиотеку 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" в конце перед ") /".

Любой вклад будет высоко ценится.

Ответы [ 5 ]

1 голос
/ 04 апреля 2019

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

0 голосов
/ 04 апреля 2019

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

0 голосов
/ 04 апреля 2019

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

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

Здесь:

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

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

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

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

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

0 голосов
/ 04 апреля 2019

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

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

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

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

Посмотрев на строку, вы обнаружите ненужный оператор группировки внутрифункция редуктора.Поэтому его можно переписать так:

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

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

array.reduce(add, 0)

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

array.reduce(add)
0 голосов
/ 04 апреля 2019

Здесь 0 - начальное значение или какое-то время также известно жопному аккумулятору. Таким образом, при уменьшении функции обратного вызова начальное значение аргумента 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...