JavaScript中的reduce()

reduce() 方法是 JavaScript 数组(Array)对象的一个非常强大的方法,它允许你对数组中的每个元素执行一个由你提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。这个方法非常适用于累加器、数组求和、字符串拼接等场景。

基本语法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
  • callback (执行数组中每个值的函数,包含四个参数):
    • accumulator 累加器累加回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(如果提供了)。
    • currentValue 数组中正在处理的元素。
    • index (可选)数组中正在处理的当前元素的索引。如果提供了initialValue,则起始索引号为0,否则为1。
    • array (可选)调用reduce的数组。
  • initialValue (可选)作为第一次调用callback函数时第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。注意:在这种情况下,数组的第一个元素将不会参与迭代。

示例

数组求和
const array = [1, 2, 3, 4];  
const sum = array.reduce((accumulator, currentValue) => accumulator + currentValue, 0);  
console.log(sum); // 输出: 10
数组元素累加(不使用初始值)

如果不使用initialValue,第一次迭代将跳过数组的第一个元素(它会被用作accumulator的初始值),从第二个元素开始迭代。

const array = [1, 2, 3, 4];  
const sumWithoutInitial = array.reduce((accumulator, currentValue) => accumulator + currentValue);  
console.log(sumWithoutInitial); // 输出: 10,但注意,这里实际上是从第二个元素开始累加的,因为1被用作初始值  
// 注意:这个示例假设数组至少有一个元素,否则会导致TypeError
数组对象属性累加
const items = [  
  {name: '苹果', price: 2},  
  {name: '香蕉', price: 4},  
  {name: '橘子', price: 3}  
];  

  // accumulator = 初始值 0

const total = items.reduce((accumulator, currentValue) => accumulator + currentValue.price, 0);  
console.log(total); // 输出: 9
字符串拼接
const array = ['Hello,', 'world!', 'Welcome', 'to', 'JavaScript.'];  
const sentence = array.reduce((accumulator, currentValue) => accumulator + ' ' + currentValue);  
console.log(sentence); // 输出: " Hello, world! Welcome to JavaScript."  
// 注意:这里累加器从空字符串开始可能更有意义,以避免结果字符串前有一个不必要的空格

1. 数组去重

const array = [1, 2, 2, 3, 4, 4, 5];  
const uniqueArray = array.reduce((acc, current) => {  
  if (acc.indexOf(current) === -1) {  
    acc.push(current);  
  }  
  return acc;  
}, []);  
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]  
  
// 使用 Set 更为简洁  
const uniqueArrayUsingSet = [...new Set(array)];  
console.log(uniqueArrayUsingSet); // 输出: [1, 2, 3, 4, 5]

2. 数组对象查找最大/最小值

假设你想找到数组中对象属性的最大值。

const items = [  
  {name: '苹果', price: 2},  
  {name: '香蕉', price: 4},  
  {name: '橘子', price: 3}  
];  
  
const maxPriceItem = items.reduce((acc, current) => {  
  return current.price > acc.price ? current : acc;  
}, {price: -Infinity});  
  
console.log(maxPriceItem); // 输出: {name: '香蕉', price: 4}

3. 数组扁平化(Flatten Array)

虽然 flat() 方法是专为数组扁平化设计的,但 reduce() 也可以实现。

const nestedArray = [1, [2, [3, 4], 5], 6];  
  
const flatArray = nestedArray.reduce((acc, val) => acc.concat(Array.isArray(val) ? val.flat() : val), []);  
// 注意:上面的代码实际上在递归调用时使用了 `flat()`,仅为了演示。  
// 一个不使用 `flat()` 的版本如下:  
  
function flattenArray(arr) {  
  return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flattenArray(val) : val), []);  
}  
  
const flatArrayWithoutFlat = flattenArray(nestedArray);  
console.log(flatArrayWithoutFlat); // 输出: [1, 2, 3, 4, 5, 6]

4. 数组分组

将数组中的元素根据某个属性分组。

const students = [  
  {name: 'Alice', grade: 'A'},  
  {name: 'Bob', grade: 'B'},  
  {name: 'Charlie', grade: 'A'},  
  {name: 'David', grade: 'B'}  
];  
  
const groupedByGrade = students.reduce((acc, current) => {  
  if (!acc[current.grade]) {  
    acc[current.grade] = [];  
  }  
  acc[current.grade].push(current);  
  return acc;  
}, {});  
  
console.log(groupedByGrade);  
// 输出: { A: [{ name: 'Alice', grade: 'A' }, { name: 'Charlie', grade: 'A' }], B: [{ name: 'Bob', grade: 'B' }, { name: 'David', grade: 'B' }] }

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

const array = ['apple', 'banana', 'apple', 'orange', 'banana', 'grape'];  
  
const count = array.reduce((acc, current) => {  
  if (acc[current]) {  
    acc[current]++;  
  } else {  
    acc[current] = 1;  
  }  
  return acc;  
}, {});  
  
console.log(count); // 输出: { apple: 2, banana: 2, orange: 1, grape: 1 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775272.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++基础22 字符串与字符数组及其相关操作

这是《C算法宝典》C基础篇的第22节文章啦~ 如果你之前没有太多C基础,请点击👉C基础,如果你C语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏:数据结构啦 ​ 目…

c++重定向输出和输出(竞赛讲解)

1.命令行重定向 在命令行中指定输出文件 指令 .\重定向学习.exe > 1.txt 效果 命令行输入和输出 指令 .\重定向学习.exe < 2.txt > 1.txt 效果 代码 #include<bits/stdc++.h> using namespace std; int n; int main(){cin>>n;for(int i=0;i<n;i…

4、SSD主控

简述 主控是个片上系统&#xff0c;由硬件和固件组成一个功能完整的系统&#xff1b;上文所述的FTL就属于主控的固件范畴。主控闪存构成了整个SSD&#xff0c;在闪存确定的情况下&#xff0c;主控就反映了各家SSD的差异。实时上各家SSD的差异也主要反应在主控上&#xff0c;毕…

VMware虚拟机Ubuntu网络有线线缆已拔出问题

1、问题描述 VMware虚拟机Ubuntu不能联网&#xff0c;打开设置中&#xff0c;网络显示“有线 线缆已拔出”。 2、查看虚拟网络连接 查看主机的网络连接&#xff0c;确保虚拟网络已启用。 3、启动虚拟机网络服务 打开主机的 ‘服务’&#xff08;winr&#xff0c;运行框中输入…

46.修复HOOK对代码造成的破坏

上一个内容&#xff1a;45.使用hook点链表实现指定跳转 以 45.使用hook点链表实现指定跳转 它的代码为基础进行修改 此代码已实现无敌与秒杀功能 HOOKPOINT.h文件里的修改 #pragma oncetypedef struct CPUINFO {unsigned eflags;unsigned edi;unsigned esi;unsigned ebp;un…

PCL从理解到应用【03】KDTree 原理分析 | 案例分析 | 代码实现

前言 本文分析KDTree的原理&#xff0c;集合案例深入理解&#xff0c;同时提供源代码。 三个案例&#xff1a;K近邻搜索、半径内近邻搜索、近似最近邻搜索。方法对比&#xff0c;如下表所示&#xff1a; 特性K近邻搜索半径内近邻搜索近似最近邻搜索描述查找K个最近邻点查找指…

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…

[深度学习]卷积理解

单通道卷积 看这个的可视化就很好理解了 https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md 多通道卷积 当输入有多个通道时,卷积核需要拥有相同的通道数. 假设输入有c个通道,那么卷积核的每个通道分别于相应的输入数据通道进行卷积,然后将得到的特征图对…

说明本文档目录是软件开发梳理需求常见问题QA文档,方便客户看,也方便我们的售前人员,需求分析人员,ui设计师,原型绘图人员,思维导图绘图人员查看。

https://doc.youyacao.com/117/2150 说明 本文档目录是软件开发梳理需求常见问题QA文档&#xff0c;方便客户看&#xff0c;也方便我们的售前人员&#xff0c;需求分析人员&#xff0c;ui设计师&#xff0c;原型绘图人员&#xff0c;思维导图绘图人员查看。 提示 本内容客户…

【ABB】控制器语言切换

【ABB】控制器语言切换 操作流程演示 操作流程 点击【菜单】点击【Control Panel】点击【Language】点击【Chinese】点击【OK】此时会弹出弹窗&#xff0c;点击【YES】此时控制器会重启&#xff0c;重启完成就是中文了 演示 点击【菜单】 点击【Control Panel】 点击【Langua…

4.2 投影

一、投影和投影矩阵 我们以下面两个问题开始&#xff0c;问题一是为了展示投影是很容易视觉化的&#xff0c;问题二是关于 “投影矩阵”&#xff08;projection matrices&#xff09;—— 对称矩阵且 P 2 P P^2P P2P。 b \boldsymbol b b 的投影是 P b P\boldsymbol b Pb。…

涂山璟无缘奥运会

“涂山璟无缘奥运会”在那片被浪漫与幻想包裹的剧集世界里&#xff0c;涂山璟与小夭的故事&#xff0c;如同夏日里的一缕清风&#xff0c;温柔而又坚定。当爱情以纯粹的形式展现&#xff0c;一个简单的愿望——亲手摘取湖中的海棠花&#xff0c;便成为了两人情感交流的甜蜜桥梁…

吉洪诺夫正则化随笔

前言 前几天在回顾压缩感知中的特征选择与LASSO回归发现了这个Tikhonov regularization&#xff0c;查了一下叫个如题的名字。先来浅说一下正则化这玩意&#xff1a;正则化&#xff08;Regularization&#xff09;是一种用来防止模型过拟合&#xff08;Overfitting&#xff09…

【数据库了解与学习】

1.下载所需版本安装包 1.1将所需文件压缩包以及安装包放在你选择的任意一盘&#xff0c;新建一个没有文字和空格的文件夹 1.2双击打开安装包&#xff0c;选择Custom自定义模式然后点击右下方的Next 1.4三连点击1&#xff0c;再点击箭头出现3&#xff0c;选中3出现4&#xff0c;…

AJAX-day1:

注&#xff1a;文件布局&#xff1a; 一、AJAX的概念&#xff1a; AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用&#xff1a; 使用axios库&#xff0c;与服务器进行数据通信 基于XMLHttpRequest封装&#xff0c;代码简单 Vue,React项目使用 学习…

day04-matplotlib入门

matplotlib Matplotlib 提供了一个套面向绘图对象编程的 API接口 是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行 它能够根据 NumPyndarray 数组来绘制 2D(3D) 图像&#xff0c;它使用简单、代码清晰易懂&#xff0c;深受广大技术爱好 者喜爱。 实列&…

云计算渲染时代:选择Blender或KeyShot进行高效渲染

在云渲染技术日益成熟的背景下&#xff0c;挑选一款贴合项目需求的3D渲染软件显得尤为关键。当前&#xff0c;Blender与KeyShot作为业界领先的全能渲染解决方案&#xff0c;广受推崇。它们虽皆能创造出令人信服的逼真视觉效果&#xff0c;但在特色功能上各有所长。本篇文章旨在…

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…

利用C语言实现三子棋游戏

文章目录 1.游戏界面2.游戏内容2.1 棋盘类型2.2棋盘的初始化2.3 打印棋盘的界面展示 3.游戏操作3.1 玩家操作3.2 电脑操作3.3 胜负判定 4.代码整合 1.游戏界面 无论写任何程序&#xff0c;我们都需要先去了解它的大概框架&#xff0c;这里我们先把它的初始界面写出来。一个游戏…

自动化设备上位机设计 二

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 namespace 自动化上位机设计 {public partial class Form1 : Form{public Form1(){InitializeComponent();timer1.Enabled true;timer1.Tick Timer1_Tick;}private void Timer1_Tick(object? sender, EventArgs e)…