Почему функция обратного вызова для уменьшения принимает четыре параметра?

63
8

При изучении метода сокращения я не совсем уверен, почему в обратном вызове требуются третий и четвертый параметры, индекс и массив. В примере из MDN:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
return previousValue + currentValue;
});

Множество других применений для метода уменьшения массива или уменьшения подчеркивания, которое я изучил, использует только первые два параметра для callback: previousValue (иногда рассматривается как accumulator) и currentValue (aka elem, значение текущего индекса),

Почему сокращение иногда написано с callback с четырьмя параметрами, а иногда и с использованием только previousValue currentValue и currentValue?

Что будет с параметрами index и array?

Должны ли все четыре параметра всегда указываться в определении функции для уменьшения в случае, если для применения сокращения требуется третий или четвертый параметры?

спросил(а) 2021-01-25T21:53:42+03:00 4 месяца, 4 недели назад
1
Решение
77

здесь (слегка) менее надуманный пример, чтобы суммировать уникальные значения в массиве, пропуская дубликаты, используя аргументы index и array для поиска уникальных значений:

[0, 1, 2, 3, 2, 1, 0].reduce(function(previousValue, currentValue, index, array) {
return array.indexOf(currentValue) === index ? // value used already?
previousValue + currentValue : // not used yet, add to sum
previousValue; // used already, skip currentValue
}); // == 6 ( 0+1+2+3 )

демо-версия: http://pagedemos.com/fn764n659ama/1/

side note: [].reduce() работает быстрее в V8, указав все четыре аргумента в качестве формальных параметров для обратного вызова, независимо от того, используется ли они кодом внутри функции.

ответил(а) 2021-01-25T21:53:42+03:00 4 месяца, 4 недели назад
63

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

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue) {
return previousValue + currentValue;
});

Последние два параметра, index и array просто дают вам дополнительную информацию, если вам это нужно. Например, предположим, что вы хотите суммировать все элементы массива, умноженные на их зеркальный элемент, т.е. Заданный массив [0, 1, 2, 3, 4] вы хотели бы вывести

(0 * 4) + (1 * 3) + (2 * 2) + (3 * 1) + (4 * 0)

то вам придется использовать последние два параметра:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
return previousValue + currentValue * array[array.length - index - 1];
});

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

ответил(а) 2021-01-25T21:53:42+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема