提升代码格调——JavaScript 数组的 reduce() 方法入门

简介: reduce() 方法为数组中的每一个元素依次执行回调函数(不包括数组中被删除或从未被赋值的元素),返回一个具体的结果。

5.png


基本概念


reduce() 方法为数组中的每一个元素依次执行回调函数(不包括数组中被删除或从未被赋值的元素),返回一个具体的结果。


语法


reduce() 接收两个参数,其基本语法为:


arr.reduce(callback,[initialValue])


参数解析:


callback  执行数组中每个值的函数,包含四个参数:


  • previousValue    第一项的值或者上一次叠加的结果值,或者是提供的初始值(initialValue)
  • currentValue    数组中当前被处理的元素
  • index     当前元素在数组中的索引
  • array     数组本身


initialValue (可选)    作为第一次调用 callback 的第一个参数,可以控制返回值的格式

reduce() 方法可以使用以下这个表达式总结一下:


[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)


基本示例


我们通过下面这个例子,来直观认识一下 reduce() 的各个参数:


const arr = [2, 4, 6, 8, 10];
let i = 0;
arr.reduce((pre, cur, index, arr) => {
    console.log(`第${ i + 1 }次执行:pre:${ pre },cur:${ cur },index:${ index }`);
    i++;
    return pre + cur;
}, 10);
// 第1次执行:pre: 10, cur: 2, index: 0
// 第2次执行:pre: 12, cur: 4, index: 1
// 第3次执行:pre: 16, cur: 6, index: 2
// 第4次执行:pre: 22, cur: 8, index: 3
// 第5次执行:pre: 30, cur: 10, index: 4
// 40


代码分析:


  • 数组中的元素依次执行了回调函数。
  • 因为给 initialValue 赋了初始值 10,所以第一次执行时, pre 的值默认从 10 开始。
  • 每次执行时,pre 的值都是 cur 元素前的所有元素之和。
  • 最后返回数组所有元素累加的和。


我们再看一下不传 initialValue 参数的执行结果:


const arr = [2, 4, 6, 8, 10];
let i = 0;
arr.reduce((pre, cur, index, arr) => {
    console.log(`第${ i + 1 }次执行:pre:${ pre },cur:${ cur },index:${ index }`);
    i++;
    return pre + cur;
});
// 第1次执行:pre: 2, cur: 4, index: 1
// 22 第2次执行:pre: 6, cur: 6, index: 2
// 22 第3次执行:pre: 12, cur: 8, index: 3
// 22 第4次执行:pre: 20, cur: 10, index: 4
// 30


可以看到,这里只执行了四次,且是从数组的第二位开始执行的,数组的第一位默认作为了 pre 的值。


实际应用


除了上面的基本应用之外,reduce() 方法还有以下应用。


计算数组中每个元素出现的次数


const arr = ['name', 'age', 'long', 'short', 'long', 'name', 'name']
arr.reduce((pre, cur) => {
    console.log(pre, cur)
    if (cur in pre) {
        pre[cur]++
    } else {
        pre[cur] = 1
    }
    return pre
}, {})
// { } "name"
// {name: 1} "age"
// {name: 1, age: 1} "long"
// {name: 1, age: 1, long: 1} "short"
// {name: 1, age: 1, long: 1, short: 1} "long"
// {name: 1, age: 1, long: 2, short: 1} "name"
// {name: 2, age: 1, long: 2, short: 1} "name"
// {name: 3, age: 1, long: 2, short: 1}


数组去重


const arr = ['name', 'age', 'long', 'short', 'long', 'name', 'name'];
let arrResult = arr.reduce((pre, cur) => {
    if (!pre.includes(cur)) {
        pre.push(cur)
    }
    return pre;
}, [])
// ["name", "age", "long", "short"]


对象属性求和


const person = [
    {
        name: 'xiaoming',
        age: 18
    }, {
        name: 'xiaohong',
        age: 17
    }, {
        name: 'xiaogang',
        age: 19
    }
]
person.reduce((a, b) => {
    a = a + b.age;
    return a;
}, 0);
// 54


总结


reduce() 方法还有很多其他用途,这里只是列出了最常见的几种,剩下的还需要大家多多探索哦!


6.png


~本文完!


学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!


知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!




相关文章
|
4月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
285 69
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
272 0
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
300 80
|
2月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
82 1
|
3月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
3月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
67 0
|
5月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
425 9
|
5月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
6月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
429 11
|
6月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~