🍉你不知道的Array.prototype.reduce()的魅力

简介: 🍉你不知道的Array.prototype.reduce()的魅力

前言


最近在复习知识点的过程总是会遇见reduce方法的身影,reduce方法好像并不常用,但是我觉得在某些场景下reduce方法还是非常适用的,那么这篇文章就来介绍reduce方法的基本适用以及它的适用场景,让我们一起来领略它的魅力吧!


语法


reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。


参数


reducer 函数接收4个参数:

  1. Accumulator (acc) (累计器)
  2. Current Value (cur) (当前值)
  3. Current Index (idx) (当前索引)
  4. Source Array (src) (源数组)


返回值


函数累计处理的结果


一段代码总结


Array.prototype.reduce() 正确使用姿势


const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15
复制代码


reduce如何运行的呢


看下面代码:


[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
  return accumulator + currentValue;
});
复制代码


callback accumulator currentValue currentIndex array return value
first call 0 1 1 [0, 1, 2, 3, 4] 1
second call 1 2 2 [0, 1, 2, 3, 4] 3
third call 3 3 3 [0, 1, 2, 3, 4] 6
fourth call 6 4 4 [0, 1, 2, 3, 4] 10


reduce的使用场景


场景一:求数组里的所有值的和


var total = [ 0, 1, 2, 3 ].reduce(
  ( acc, cur ) => acc + cur,
  0
);
复制代码


场景二:累加对象数组里的值


var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(
    (accumulator, currentValue) => accumulator + currentValue.x
    ,initialValue
);
console.log(sum) // logs 6
复制代码


场景三:数组扁平化


var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
 ( acc, cur ) => acc.concat(cur),
 []
);
复制代码


场景四:计算数组中每个元素出现的次数


var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name) {
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
复制代码


场景五:数组去重


let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
let myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
  if (accumulator.indexOf(currentValue) === -1) {
    accumulator.push(currentValue)
  }
  return accumulator
}, [])
console.log(myOrderedArray)
复制代码


最后


⚽本文介绍了reduce的基本使用以及使用场景~

⚾如果这篇文章对你有帮助的话,麻烦点赞收藏哟~

相关文章
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1792 14
|
人工智能 自动驾驶 编译器
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
2240 0
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
|
7月前
|
SQL Java 索引
IDEA 2026.1 重磅更新:Java 开发效率翻倍的核心新特性全拆解
IDEA 2026.1重磅发布:启动/索引/内存全面优化,冷启提速40%、热启秒开;原生支持JDK 17–23,深度集成虚拟线程调试与重构;AI辅助编码、MyBatis XML一键转MP、分布式链路调试、K8s原生集成,Java开发效率跃升新高度。
1763 1
|
16天前
|
API 异构计算
类Jev项目Kev从入门到实战(6):Jev / Kev / Laya 对比
Jev闭源不可训,Laya轻量但微调难,Kev是唯一支持本地微调的开源方案(Apache-2.0),兼容Jev API,可将业务规则、领域知识注入模型,真正实现“数据进模型”。
271 0
|
7月前
|
数据采集 存储 监控
注塑机数据采集如何实现与 MES 系统的双向数据闭环?
本文从落地实操出发,系统解析注塑机数据采集的适配范围、400+核心参数、四大应用场景及系统对接方案,直击设备协议繁杂、数据维度不足、系统孤岛等三大难点,提供非侵入式、全覆盖、可闭环的数字化升级路径。
841 6
|
4月前
|
Java API Maven
Maven多模块项目拆分实战:从50万行单体到独立模块的演进
本文基于一个 50 万行代码的电商单体项目拆分经历,讲解 Maven 多模块项目的完整搭建过程。从模块划分原则、父 POM 设计、循环依赖破解到编译部署优化,给出可直接复用的配置模板和踩坑总结。
|
5月前
|
人工智能 自然语言处理 语音技术
盘点 7 款文本转语音工具:从免费朗读到可控情绪合成
参考社区里关于免费文本转语音工具的盘点思路,整理 Edge TTS、TTSMaker、Luvvoice、FlowSpeech、Fish Audio、ChatTTS、EmotiVoice 7 类 TTS 工具的适用场景,并从脚本验证、创作者旁白、情绪控制、开源实验和素材管理角度给出选型建议。
|
9月前
|
数据采集 自然语言处理 搜索推荐
大模型从“瞎聊”到“干活”:指令微调核心逻辑全拆解
本文深入浅出解析大模型指令微调核心技术,从“能聊”到“会干”的关键跃迁。通过“教小孩做事”类比,拆解指令微调原理,详解数据格式、质量与策略三要素,提供16G显卡可跑的四步实操流程,并结合效果评估与未来趋势,助力新手快速掌握让大模型精准执行任务的核心方法。