Какова роль 0 как initalValue для функции снижения? - PullRequest
0 голосов
/ 27 января 2019

для изучения reduce функции Я экспериментировал с этим примером w3schools

<!DOCTYPE html>
<html>
<body>

<p>Click the button to get the sum of the rounded numbers in the array.</p>
<button onclick="myFunction()">Try it</button>

<p>Sum of numbers in array: <span id="demo"></span></p>

<script>
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);
}
</script>

</body>
</html>

В этом примере, если мы передадим 0 для initalValue, он вернет 24, но если мы используем значение по умолчанию initalValue, результат будет 23,5!Так что я не могу получить нулевую точку и почему это меняет результат!не равен ли initialValue уже 0?

Ответы [ 4 ]

0 голосов
/ 27 января 2019

initialValue (Необязательно) - значение, используемое в качестве первого аргумента для первого вызова обратного вызова.1. Если начальное значение не указано, будет использован первый элемент в массиве.2. Вызов метода Reduce () для пустого массива без начального значения является ошибкой.(см. mdn)

Согласно 1-му выражению, если не используется начальное значение, первый элемент будет использоваться, поэтому в этом массиве [15.5, 2.3, 1.1, 4.7] первый элемент используется в качестве начального значения, посколькукоторый math.round () не применяется к начальному значению (15,5).

A.Таким образом, с 0 вход для функции понижения равен - 0 + 16 + 2 + 1 +5 = 24 B. Без 0 вход составляет - 15,5 + 2 + 1 + 5 = 23,5

Таким образом, интерпретация 1-го и 2-го утвержденияЕсли вы хотите выполнить какую-либо операцию над входами (например, Math и т. д.), вы должны указать желаемое начальное значение (например, 0 в приведенном выше случае).

0 голосов
/ 27 января 2019

Если исходное значение не указано, будет использоваться первый элемент в массиве.Вызов метода Reduce () для пустого массива без начального значения является ошибкой.

Таким образом, у вас есть 15.5 в качестве начального значения, если вы не используете 0

. Вы можете прочитатьздесь для получения дополнительной информации -> Сокращение параметров

Например, вы можете увидеть этот код, если видите, поскольку у нас 0,1 в начале, поэтому он принимается в качестве начального значения.

let arr = [0.1,15.5, 2.3, 1.1, 4.7]

let output = arr.reduce((op, cur) => op+=Math.round(cur) )

console.log(output)
0 голосов
/ 27 января 2019

Если начальное значение равно 0, то все суммы, возвращаемые getSum, являются целыми числами, первое вычисление равно 0 + Math.round (15.5) = 16. Все дальнейшие слагаемые являются целыми числами, поскольку они добавляются с использованием Math.round.Вот почему конечный результат - целое число (24).Если начальное значение не задано, первая сумма, вычисленная getSum, равна 15,5 + Math.round (2.3) = 17,5.Все дальнейшие вычисления выполняются с первым, не округленным слагаемым, которое не является целым числом, но имеет десятичную часть 0,5.Таким образом, конечный результат не является целым числом.Может быть полезно поставить

console.log("add "+total+"  +  "+num+" => "+Math.round(num)+"  =  "+(total + Math.round(num)));

в качестве первой строки в функции getSum и увидеть вывод консоли (F12 в Firefox).

0 голосов
/ 27 января 2019

Нет .Начальное значение accumulator является первым элементом в array, и оно начинается со второго элемента, пока явно не будет присвоено значение accumulator (0 в данном случае).Когда значение не было задано, accumulator было уже 15,5 в начале, но когда вы дали ему значение 0, оно началось оттуда, следовательно, разница в результатах.

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

Примечание. Если значение initialValue не задано, Reduce () выполнит обратный вызовФункция начинается с индекса 1, пропуская первый индекс.Если значение initialValue указано, оно будет начинаться с индекса 0.

См. MDN

...