【前言】今天我们将要讨论的JavaScript中的一个函数是
Reduce
高阶函数。这主要是因为,在所有 JS 数组方法中,我花了一些时间来理解 Reduce 函数的工作原理。本文假设读者了解Map
和Filter
等其他数组方法,因为它将有助于理解Reduce
的工作原理。为了完全掌握Reduce背后的思想,我们将使用for
循环的简单解决方案示例,然后使用Reduce
函数实现这些相同的解决方案。然后我们将看看Reduce
函数的一些更高级的用例。
示例
目标:计算数组中项的总和 for求和:
const array = [1,2,3,4,5,6];
let sum = 0;
for (let i = 0; i < array.length; i++) {
sum = sum + array[i];
}
console.log(sum) // 21
for
循环求数组中各项的和,其核心是利用循环将每一个数组的值添加到变量sum
中,最终累加求和。 Reduce求和:
const array = [1,2,3,4,5,6];
const sum = array.reduce(function(a, b){
a = a + b;
return a;
}, 0);
console.log(sum) // 21
通过两种方法的对比,很明显
for
循环求数组和的方法更加简单,这也是数组求和中存在争论的地方,通过上述Reduce
方法求数组的和让我们一起来了解一下数组的Reduce
函数的工作原理。
Reduce函数是什么
语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数说明:
total
:必需,初始值或者计算结束后的返回值;currentValue
:必需,当前元素;currentIndex
:可选,当前元素的索引;arr
:可选,当前元素所属的数组对象;initialValue
:可选,传递给函数的初始值。
定义
定义:
Reduce
函数是每一个JavaScript数组都存在的方法,他能使我们遍历数组中的每个项目并对每个项目执行一个函数,这与Map
函数极为相似,但它有一个转折点——它允许我们在特定迭代中从函数返回任何值,然后在下一次迭代中作为参数(参数)存在于该函数中(该值通常称为累加器)
为进一步解释,Reduce
函数采用2个参数
- 回调函数:这是一个通常包含 4 个参数的函数。但现在我们只关心第一个累加器,第二个是迭代期间数组中的当前项。
- 初始值:这是迭代开始时累加器的初始值。在上面的示例中,该值为 0,这意味着累加器的初始值为 0。
回到上面的例子,进行分析:
const array = [1,2,3,4,5,6];
const sum = array.reduce(function(a, b){
a = a + b;
return a;
}, 0);
console.log(sum) // 21
可以进一步分解为回调函数和初始值:
const array = [1,2,3,4,5,6];
function callbackFunction(a, b){
a = a + b;
return a;
}
const c = 0;
const sum = array.reduce(callbackFunction, c);
console.log(sum) //21
迭代一
在第一次迭代中,由于我们的初始值为 0,我们的累加器的值为 0。所以我们的函数将如下所示:
const array = [1,2,3,4,5,6];
// 1 is the current item in the array
function callbackFunction(a = 0, b = 1){
a = 0 + 1;
return a // which is 1;
}
- 这里的
callbackFunction
函数将返回1,这将自动用作第二次迭代中累加器的下一个值。 迭代二
const array = [1,2,3,4,5,6];
// 2 is the current item in the array
function callbackFunction(a = 1, b = 2){
a = 1 + 2;
return a // which is 3;
}
- 在本次迭代中,我们的累加器将有一个值 1,该值在我们的第一次迭代中返回。将
callbackFunction
在此迭代中返回值 3。这意味着我们的累加器在第三次迭代中的值为3。 迭代三
const array = [1,2,3,4,5,6];
// 3 is the current item in the array
function callbackFunction(a = 3, b = 3){
a = 3 + 3;
return = a // which is 6;
}
- 在第三次迭代中,我们的累加器将有一个值 3,这是
callbackFunction
在迭代 2 中 返回的。callbackFunction
将返回一个值 6,将用作迭代 4 中累加器的值。这些步骤将不断重复,直到我们到达数组中的最后一项,即6,通过不断的迭代最后计算出数组的和21。