JavaScript 数组 reduce() 方法

JavaScript reduce() 语法

reduce() 是 JavaScript 数组的一个方法,它用于遍历一个数组。reduce() 方法会在回调函数中对数组每个元素进行 “累积操作”(如累加、累乘等),最终返回一个值。

语法:

arr.reduce(callbackFn, initValue)

说明:

reduce() 方法可以接收以下 2 个参数。

  • callbackFn(必选):是一个回调函数,所有数组元素都会依次执行该函数。
  • initValue(可选):累积操作的初始值。如果省略,则会将数组第一个元素作为初始值。

callbackFn 这个回调函数的形式如下:

function (total, currentValue, currentIndex, array) {
    ……
}

callbackFn 回调函数接收 4 个参数,说明如下。

  • total(必选):是函数的返回值(累积值)。
  • currentValue(必选):是当前元素的值。
  • currentIndex(可选):是当前元素的下标。
  • array(可选):表示当前数组对象(代表整个数组)。

注意:

  • reduce() 不会为没有值的数组元素(即稀疏数组中的空槽)执行 callback 函数。
  • 不要对空数组使用 reduce(),否则它可能返回 0 或抛出 TypeError 异常。

数组的遍历方法

对于 JavaScript 数组来说,它主要有以下 5 种遍历方法。其中,map()filter()、reduce()、reduceRight() 这 4 种可以看成是对 forEach() 方法的进一步封装。

  • forEach():只会单纯遍历数组,在回调函数中对每一个元素进行 “相同操作”。它不会返回任何值,只是操作完就算了。
  • map():遍历数组的同时,在回调函数中对每个元素进行 “相同操作”。然后将 “处理后的元素” 添加到新数组中,最终返回一个新数组。
  • filter():遍历数组的同时,在回调函数中对每个元素进行 “过滤操作”。然后将 “符合条件的元素” 添加到新数组中,最终返回一个新数组。
  • reduce():遍历数组的同时,在回调函数中对每个元素进行 “累积操作”。最终返回一个值(这个值不一定是数组)。
  • reduceRight():功能与 reduce() 方法相同,只不过 reduce() 是从左到右操作数组元素,而 reduceRight() 是从右到左操作数组元素。

JavaScript reduce() 摘要

属于 JavaScript Array 对象
使用频率
修改原数组
官方文档 查看
MDN 查看

JavaScript reduce() 示例

接下来,我们通过几个简单的例子来讲解一下 JavaScript reduce() 方法是如何使用的。

示例 1:reduce() 实现数组元素求和

const arr = [3, 9, 1, 12, 50, 21];
const result = arr.reduce(function(total, current){
    total += current;
    return total;
}, 0);
console.log(result);

运行结果如下。

96

分析:

想要对数组元素进行求和,我们需要使用 initValue 这个参数,给它设置一个初始值 0,以便用于累加。

reduce() 方法本质上是一个高阶函数。所谓的高阶函数,指的是一个函数的参数又是一个函数。在实际开发中,我们更推荐使用 “箭头函数” 的方式书写 reduce() 的回调函数。下面两种方式是等价的。

// 方式1:不使用箭头函数
const result = arr.reduce(function(total, current){
    total += current;
    return total;
}, 0);

// 方式2:使用箭头函数
const result = arr.reduce((total, current) => {
    total += current;
    return total;
}, 0);

此外,对于上面例子 reduce() 方法实现的功能,其实也可以使用 forEach() 方法来实现,代码如下:

const arr = [3, 9, 1, 12, 50, 21];
let result = 0;
arr.forEach((element) => {
    result += element;
});
console.log(result);

示例 2:reduce() 实现数组去重

const arr = [5, 1, 1, 3, 4, 3];
const resultArr = arr.reduce((acc, current) => {
    if(total.indexOf(current) === -1){
        acc.push(current);
    }
    return acc;
}, []);
console.log(resultArr);

运行结果如下。

[5, 1, 3, 4]

分析:

对于数组去重来说,我们需要建立一个空数组来保存结果,因此也需要借助 initValue 这个参数。

示例 3:reduce() 获取数组最值

const arr = [3, 9, 1, 12, 50, 21];
//最大值
const max = arr.reduce((result, current) => {
    result = Math.max(result, current);
    return result;
});
console.log(max);

//最小值
const min = arr.reduce((result, current) => {
    result = Math.min(result, current);
    return result;
});
console.log(min);

运行结果如下。

50
1

分析:

对于这个例子来说,我们是不需要借助累积的结果,因此不需要使用 initValue 这个参数。

reduce() 是数组的 “归并方法”,与 map()、filter()、forEach() 等迭代方法一样,都会对数组每一项进行遍历。但 reduce() 可以同时将上一次遍历产生的结果与当前遍历的元素进行运算,这一点是其他迭代方法无法企及的。

reduce() 与 reduceRight() 的区别

reduce() 和 reduceRight() 这两个方法非常相似,它们的功能也是一样的,只是略有区别。

  • reduce():会在回调函数中对数组每个元素 “从左到右” 进行累积操作(如累加、累乘等),最终返回一个值。
  • reduceRight():会在回调函数中对数组每个元素 “从右到左” 进行累积操作(如累加、累乘等),最终返回一个值。

提示: 在实际开发中,reduceRight() 方法较少用到,大多数情况下使用的是 reduce() 方法。

上一篇: filter()

下一篇: reduceRight()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号