🚀详解JavaScript系列之数组(十)终结篇

336 阅读4分钟

image.png


这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


前言

接上一篇文章,我们来详细解读js数组的内容,本篇幅讲述“数组的遍历(5)”,上一篇传送门


reduce()

作用: reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。返回值是回调函数累计处理的结果。

语法

arr.reduce(function (previousValue, currentValue, currentIndex, arr) {
  ...
}, initialValue);
  • previousValue:必填,上一次调用回调函数时的返回值
  • currentValue:必填,当前正在处理的数组元素
  • currentIndex:选填,当前正在处理的数组元素下标
  • arr:选填,调用 reduce()方法的数组
  • initialValue:选填,可选的初始值(作为第一次调用回调函数时传给 previousValue 的值)

在以往的数组方法中,匿名的回调函数里是传三个参数:item、index、arr。但是在 reduce() 方法中,前面多传了一个参数previousValue,这个参数的意思是上一次调用回调函数时的返回值。第一次执行回调函数时,previousValue 没有值怎么办?可以用initialValue 参数当做初始值传给它。

注意:很多人一开始接触 reduce() 的时候会很懵逼,我也一样,但是多写几个样例,有事没事多看几遍,自然就掌握了。reduce在开发中也是一个提高效率的常用高阶函数,如果我们能熟练掌握 reduce() 的用法,将能替代很多其他的数组方法,并逐渐走上进阶之路,就冲蒟蒻变成大牛了

为了方便理解 reduce(),我们先来看看下面的简单代码,试试水,hhhh....:

let arr1 = [1, 2, 3, 4, 5, 6];
let res = arr1.reduce((prev, item) => {
    console.log('上一个数是',prev);
    console.log('当前数是',item);
    console.log('------');
    return 88;
}, 0);
console.log('reduce的返回值是:',res)
/*
 上一个数是 0
 当前数是 1
 ------
 上一个数是 88
 当前数是 2
 ------
 上一个数是 88
 当前数是 3
 ------
 上一个数是 88
 当前数是 4
 ------
 上一个数是 88
 当前数是 5
 ------
 上一个数是 88
 当前数是 6
 ------
 reduce的返回值是: 88
 */

上面的代码中,由于return的是固定值,所以 prev 打印的也是固定值(只有初始值是 0,剩下的遍历中,都是打印 88)。我们可以发现reduce是返回值是上一次回调的结果,他不是空也不是数组。

现在来升级一下,实际开发中,prev 的值往往是动态变化的,这便是 reduce()的精妙之处。我们来看几个例子就明白了。


应用

求和

计算数组中所有元素项的总和。代码实现:

const arr = [2, 0, 1, 9, 6];
// 数组求和
const total = arr.reduce((prev, item) => {
    return prev + item;
});
console.log('total:' + total); // 打印结果:18
统计某个元素出现的次数
// 定义方法:统一 value 这个元素在数组 arr 中出现的次数
function repeatCount(arr, value) {
    if (!arr || arr.length == 0) return 0;
​
    return arr.reduce((totalCount, item) => {
        totalCount += item == value ? 1 : 0;
        return totalCount;
    }, 0);
}
​
let arr1 = [1, 2, 6, 5, 6, 1, 6];
​
console.log(repeatCount(arr1, 6)); // 打印结果:3
求元素的最大值
const arr = [2, 0, 1, 9, 6];
// 数组求最大值
const maxValue = arr.reduce((prev, item) => {
    return prev > item ? prev : item;
});
console.log(maxValue); // 打印结果:9

小结:是不是发现reduce很diao,很np。实际上他还有很多很多的应用,在开发时真的是一大利器。

写在最后

不知不觉整个数组系列也写完了。自己在总结的同时,也在回顾学习,很多东西,时间久了就容易忘。一遍又一遍除了巩固之外,对知识点又有了更深的理解。预告下一期:函数系列


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤