数组的{.reduce方法

时间:2016-06-22 12:58:30

标签: javascript arrays

嗨,这里是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);
}

4 个答案:

答案 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);
}

因此,对于数组中的每个值,将调用您作为参数传递的函数,并且其参数将填充previousValuecurrentValue

当然reduce()肯定更长,但最后它从数组中获取内容,做一些魔术,并传递给你作为回调参数传递的函数。

答案 1 :(得分:1)

在函数getSum中,您有两个参数,totalnum这些参数分别相当于w3学校中的totalcurrentValue例。在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;