🍉你不知道的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的基本使用以及使用场景~

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

相关文章
|
编解码 安全 网络协议
实测:游戏情景中,远控软件实力如何?一篇告诉你ToDesk的强大之处
实测:游戏情景中,远控软件实力如何?一篇告诉你ToDesk的强大之处
实测:游戏情景中,远控软件实力如何?一篇告诉你ToDesk的强大之处
|
7月前
|
虚拟化 Windows
Hyper-V无声音问题排查指南,是什么原因导致的
Hyper-V无声音问题可能由多种原因导致,如虚拟机配置、增强会话模式、远程桌面连接、集成服务及物理机音频驱动等。需逐一排查:确保操作系统和音频驱动正确安装,启用增强会话模式,检查RDP设置,更新集成服务和物理机驱动,查看日志并重启相关服务。通过这些步骤,通常可以解决大多数无声音问题。若问题依旧,建议联系技术支持。
|
存储 数据采集 Apache
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
随着业务在金融、保险和商城领域的不断扩展,众安保险建设 CDP 平台以提供自动化营销数据支持。早期 CDP 平台依赖于 Spark + Impala + Hbase + Nebula 复杂的技术组合,这不仅导致数据分析形成数据孤岛,还带来高昂的管理及维护成本。为解决该问题,众安保险引入 Apache Doris,替换了早期复杂的技术组合,不仅降低了系统的复杂性,打破了数据孤岛,更提升了数据处理的效率。
1950 6
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
|
存储 Java
java实现双向循环链表(循环双链表)
线性表是我们最常用的一种数据结构,线性表包含顺序表和链表,顺序表典型应用就是我们常用的ArrayList,链表的典型应用其中就有我们常用的LinkedList。LinkedList他的底层就是使用链表来存储数据元素的。这篇文章用以总结链表中的双向循环链表,为单链表的结点增加一个指向前驱的指针域,单链表就变成了双链表,将双链表的头尾相连,双链表就成了双向循环链表。
451 0
java实现双向循环链表(循环双链表)
|
Go PHP
Gin从入门到精通—如何理解安装Gin并在本地运行
Gin从入门到精通—如何理解安装Gin并在本地运行
699 0
Gin从入门到精通—如何理解安装Gin并在本地运行
|
Python
【PyQt】记录各种组件的使用方法【下】
使用Python开发GUI界面工具,通常可用选择PyQt框架,非常易使用,而且网上也有很多相关的文档分享。我也是在写了多个GUI界面后,自己整理了一些常用的使用文档,在此分享给大家(PyQt4~PyQt5适用)。
418 0
【PyQt】记录各种组件的使用方法【下】
|
Android开发 内存技术
嵌入式实践教程--Android音视频开发(二)-OpenSLES播放PCM数据
嵌入式实践教程--Android音视频开发(二)-OpenSLES播放PCM数据
|
Web App开发 前端开发 开发者
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型
370 0
|
存储 索引
EasyRecovery最新中文版超强专业数据恢复软件
Ontrack® EasyRecovery超强专业数据恢复软件,恢复成功率非常高!硬盘数据恢复软件相当给力,轻松找回各种丢失数据如此简单!支持各类存储设备的数据恢复,恢复能力强,
400 0
|
Linux
LINUX下载编译FriBidi
LINUX下载编译FriBidi
156 0