嗨,这里是w3学校使用数组reduce方法的一些代码。我正在尝试学习如何使用它,但是我对这个代码甚至可行的原因感到有些困惑。原因是numbers.reduce(getSum)
doesent在函数getSum中获取参数。我们的代码如何知道数组内部有多少内容,以及如果我们甚至不为getSum函数提供参数,如何对它们求和。在w3schools上它说array.reduce(function(total,currentValue,currentIndex,arr),initialValue)
,并且还说需要total和currentValue。但我们在这里甚至没有他们吗?我们只是有我们的功能!请帮忙
<!DOCTYPE html>
<html>
<body>
<p>Click the button to get the sum of the 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 = [65, 44, 12, 4];
function getSum(total, num) {
return total + num;
}
function myFunction(item) {
document.getElementById("demo").innerHTML = numbers.reduce(getSum);
}
</script>
</body>
</html>
另一个例子......不确定区别是什么
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);
}
答案 0 :(得分:1)
reduce函数的语法是arr.reduce(callback[, initialValue])
。
这意味着getSum被称为回调。
什么是回调?为了方便起见,它是对将在第二时刻调用的函数的引用。
一个简单的例子(但网络上有很多回调指南):
function print(value) {
console.log(value)
}
function callCallback(callback) {
callback('Hello world!');
}
callCallback(print);
如您所见, print 是一个函数,对它的引用作为参数传递给callCallback()
。然后在callCallback()
内调用该函数。
让我们回到你的问题:
reduce()
需要引用函数作为第一个参数。
reduce是一个函数,里面会做一些事情(看一个可能的实现,read here)。
某处reduce()
将回调您作为参数传递的函数,传递右对数。
我们已经减少了这样的事情:
reduce(callback) {
callback(previousValue, currentValue);
}
因此,对于数组中的每个值,将调用您作为参数传递的函数,并且其参数将填充previousValue
和currentValue
当然reduce()肯定更长,但最后它从数组中获取内容,做一些魔术,并传递给你作为回调参数传递的函数。
答案 1 :(得分:1)
在函数getSum
中,您有两个参数,total
和num
这些参数分别相当于w3学校中的total
和currentValue
例。在javascript中,您的函数不必在函数中具有相同的变量名称。传递给reduce
的函数需要两个参数,第一个将用作“运行总计”,第二个用作“当前值”。
就问题而言,它如何知道数组中有多少值,请查看MDN提供的polyfill。它为如何为数组实现reduce
函数以及知道数组的长度提供了一些见解。
答案 2 :(得分:1)
array.reduce(回调[,初值])。
Callback =一个在数组的每个值上执行的函数,有4个参数。
1)previousValue =上一次回调中返回的值或者使用reduce给出的初始值。
2)currentValue =关闭数组中当前元素的值。
3)currentIndex =数组中当前元素的索引。
4)array =在
上调用的数组initialValue是可选的,它在第一个回调中为我们之前的值提供了一个起始值。
实际上,你有参数。初始值(是前一个回调的结果),实际数字,数字索引和数字数组。编辑:如果您没有给出初始值,那么您之前的值将是数组的第一个元素,而当前值将是第二个元素。
编辑2:你在第一次运行时的先前值将是65,你当前的值将是44.他们加起来,得到109的结果,并将其作为结果值。在您完成阵列之前调用该函数。这意味着你第一次回调(109)的返回值将是你第二次回调的previousValue。它将再次添加前一个(109)和当前,作为数组中的下一个(第三个)元素。他们将它们加起来(109 + 12)并返回下一个回调的值等等。直到你已经通过整个数组。最后它只返回总数。
答案 3 :(得分: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;