.reduce метод для массивов

Привет здесь, это код с w3-школами, использующий метод array numbers.reduce (getSum). Я пытаюсь научиться использовать это, однако я немного запутался в том, почему этот код работает. Причина в том, чтоarray.reduce(function(total,currentValue,currentIndex,arr),initialValue)doesent взять параметры в функции <! DOCTYPE html> <html> <body> <p> Нажмите кнопку, чтобы получить сумму чисел в массиве. </ p> <button onclick = "myFunction ()"> Попробуйте </ button> <p> Сумма чисел в массиве: <span id = "demo"> </ span> </ p> <script> var numbers = [65, 44, 12, 4]; function getSum (total, num) {return total + num; } function myFunction (item) {document.getElementById ("demo"). innerHTML = numbers.reduce (getSum); } </ script> </ body> </ html>. Как наш код даже знает, сколько вещей внутри массива и как их суммировать, если мы даже не даем параметры функции getSum. В w3schools сказано var numbers = [15.5, 2.3, 1.1, 4.7]; function getSum(total, num) { return total + Math.round(num); } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum,0); } , а также говорится, что getSum и общая сумма требуются. Но у нас их даже нет? у нас просто есть наша функция! Помоги пожалуйста

num

Вот еще один пример. Не уверен, в чем разница.

total

javascript,arrays,

0

Ответов: 4


1

В функции у getSumвас есть два параметра, currentValueи reduceони эквивалентны totalи reduce, соответственно, в вашем примере школ w3. В javascript ваша функция не должна иметь одинаковые имена переменных в функции. Для функции, к которой вы проходите arr.reduce(callback[, initialValue]), требуются два аргумента , и первый будет использоваться как «общая сумма», а второй - «текущее значение».

Что касается вопроса, как он знает, сколько значений находится внутри массива, посмотрите на полиполк, предоставленный MDN . Он дает некоторое представление о том, как можно реализовать reduceфункцию для массива и знать, как долго будет массив.


1

Синтаксис функции уменьшения function print(value) { console.log(value) } function callCallback(callback) { callback('Hello world!'); } callCallback(print); .

Это означает, что getSum вызывается как обратный вызов .

Что такое обратный вызов? Проще говоря, это ссылка на функцию, которая будет вызываться во второй момент.

Простой пример (но в Интернете полно руководств по обратному вызову):

callCallback()

Как вы можете видеть, печать - это функция, а ссылка на нее передается как аргумент callCallback(). Затем функция вызывается внутри reduce().

Вернемся к вашему вопросу:

reduce() требует ссылки на функцию в качестве первого аргумента.

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

Где- reduce(callback) { callback(previousValue, currentValue); } то перезвонит функция, которую вы передали в качестве аргумента, передав правильные параметры.

Мы сократили это примерно так:

previousValue

Поэтому для каждого значения в массиве будет вызываться функция, которую вы передали как аргумент, и ее аргументы будут заполнены currentValueиcurrentValue

Конечно, reduce () определенно длиннее, но в конце он берет вещь из массива, делает некоторую магию и переходит к функции, которую вы передали в качестве аргумента обратного вызова.


1

array.reduce (обратный вызов [, InitialValue]).

Callback = функция, выполняемая для каждого значения массива, имеющая 4 аргумента.

1) previousValue = значение, возвращаемое в предыдущем обратном вызове, или значение, указанное с уменьшением.

2) currentValue = значение от текущего элемента массива.

3) currentIndex = индекс текущего элемента в массиве.

4) array = массив, на который он вызывается

initialValue не является обязательным, и дает нашему предыдущему значению начальное значение в первом обратном вызове.

Итак, у вас есть аргументы. начальное значение (являющееся результатом предыдущего обратного вызова), фактическое число, индекс номера и массив чисел.

EDIT: если вы не укажете начальное значение, ваше предыдущее значение будет первым элементом массива, а ваше текущее значение - вторым.

EDIT 2: Ваше предыдущее значение в вашем первом прогоне будет 65, а ваше текущее значение будет 44. Они складываются, дают результат, который составляет 109, и дают это как результат. Функция вызывается до тех пор, пока вы не закончите свой массив. Таким образом, это означает, что возвращаемое значение вашего первого обратного вызова (109) будет предыдущим значением вашего второго обратного вызова. Снова он добавит предыдущий (109) и текущий, являющийся следующим (третьим) элементом в вашем массиве. Они добавляют их (109 + 12) и возвращают значение для следующего обратного вызова и т. Д. До тех пор, пока вы не пройдете весь массив. В конце он просто возвращает вам итог.


0

вы должны различать вызов функции и определение функции.

определение функции

function test() {}

вызов функции

test();

передача функции требует определения функции, а не вызова, поэтому вы можете передать ссылку (переменную, определяющую функцию) или само определение функции.

numbers.reduce(functionVariableReference); // pass function definition
numbers.reduce(function() {}) //anonymous function definition

Array.reduce требует обратного вызова для выполнения на каждом элементе, этот обратный вызов передает следующие параметры при вызове, total,currentValue,currentIndex,arr

Другой пример:

function test(nOne, nTwo) {console.log(nOne + nTwo);}
function passTwoAndThree(callback) {callback(2,3)};
passTwoAndThree(test) // will log 5;
JavaScript, массивы,