JavaScript API 简介:Reduce 函数

104 阅读3分钟

104DABEC-20DF-43A9-8338-5AAD89D67480_1_105_c.jpeg 【前言】今天我们将要讨论的JavaScript中的一个函数是 Reduce 高阶函数。这主要是因为,在所有 JS 数组方法中,我花了一些时间来理解 Reduce 函数的工作原理。本文假设读者了解MapFilter等其他数组方法,因为它将有助于理解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)

参数说明:

  1. total:必需,初始值或者计算结束后的返回值;
  2. currentValue:必需,当前元素;
  3. currentIndex:可选,当前元素的索引;
  4. arr:可选,当前元素所属的数组对象;
  5. 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。