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 = 初始值 0const 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.mzph.cn/news/866858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

010 Volatile和本地线程

文章目录 关键字Volatile可见性:原子性:有序性: 本地线程如何创建ThreadLocal变量如何访问ThreadLocal变量关于InheritableThreadLocal 关键字Volatile Volatile是轻量级的synchronized,在多处理器环境下,可以保证共享变量的可见…

蝙蝠优化算法(Bat Algorithm,BA)及其Python和MATLAB实现

蝙蝠优化算法(Bat Algorithm,简称BA)是一种基于蝙蝠群体行为的启发式优化算法,由Xin-She Yang于2010年提出。该算法模拟了蝙蝠捕食时在探测目标、适应环境和调整自身位置等过程中的行为,通过改进搜索过程来实现优化问题…

UML2.0-系统架构师(二十四)

1、(重点)系统()在规定时间内和规定条件下能有效实现规定功能的能力。它不仅取决于规定的使用条件等因素,还与设计技术有关。 A可靠性 B可用性 C可测试性 D可理解性 解析: 可靠性:规定时间…

ServiceImpl中的参数封装为Map到Mapper.java中查询

ServiceImpl中的参数封装为Map到Mapper.java中查询,可以直接从map中获取到key对应的value

论文阅读【时间序列】DSformer

论文阅读【时间序列】DSformer arxive: DSformer: A Double Sampling Transformer for Multivariate Time Series Long-term Prediction github: MTST 分类:多变量时间序列(Multivariate time series) 核心观点 多变量时间序列3个维度信息 …

Spring Cloud Alibaba组件概览

目录 Spring Cloud Alibaba组件概览引言一、Spring Cloud Alibaba概述二、Spring Cloud Alibaba组件概览2.1 Nacos2.1.1 概述2.1.2 特点2.1.3 应用场景2.1.4 实例分析 2.2 Sentinel2.2.1 概述2.2.2 特点2.2.3 应用场景2.2.4 实例分析 2.3 RocketMQ2.3.1 概述2.3.2 特点2.3.3 应…

Android AlertDialog对话框

目录 AlertDialog对话框普通对话框单选框多选框自定义框 AlertDialog对话框 部分节选自博主编《Android应用开发项目式教程》(机械工业出版社)2024.6 在Android中,AlertDialog弹出对话框用于显示一些重要信息或者需要用户交互的内容。 弹出…

【Linux进阶】磁盘分区2——MBR和GPT

1.磁盘的分区 因为如果你的磁盘被划分成两个分区,那么每个分区的设备文件名是什么? 在了解这个问题之前,我们先来复习一下磁盘的组成,因为现今磁盘的划分与它物理的组成很有关系。 我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马…

Go 语言 UUID 库 google/uuid 源码解析:时钟信息

google/uuid 库地址 google/uuid 时间相关的部分汇聚在 uuid 包下的 time.go 文件中。 UUID 的 RFC 4122 变体中的版本1和版本2依赖于时钟信息,所以 uuid 库将时钟信息的实现定义在本文件中,供对应版本 UUID 的生成使用。 UUID 依赖于时钟信息的实现版…

5G NR与4G LTE的技术差异

5G NR与4G LTE的技术差异 5G与4G相比,5G(NR)技术有以下优势点: 一、总体技术方面 系统消息 4G(LTE): 支持在任何条件(或情况)下始终开启所有系统消息的广播,导致大量资源浪费,且终端(UE)需要持续评估。 系统信息广播是终端(UE)…

gda动态调试-cnblog

忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法,选择调试方法,gda会自动监听函数的返回值,例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本

window.ai 开启你的内置AI之旅

❝ 成功是得你所想,幸福是享你所得 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 AI( Gemini Nano) Chrome Ollama 因为,行文字数所限,有些概念可能会一带而过亦或者提供…

【matlab】回归预测/异常检测——智能优化算法极限学习机

目录 引言 基本原理 主要特点 应用领域 发展趋势 智能优化算法——蜣螂优化算法(DBO) 算法原理 算法特点 应用前景 代码实现 ELM训练函数——elmtrain 函数 ELM预测函数——elmpredict 函数 适应度函数 主函数 引言 极限学习机(…

【C++设计模式】(二)设计模式简介

(二)设计模式简介 设计模式的概念来源于建筑学,最早由建筑学家克里斯托弗亚历山大(Christopher Alexander)在其著作《建筑的模式语言》(A Pattern Language)中提出。亚历山大提出了一系列在建筑…

【数据挖掘】银行信用卡风险大数据分析与挖掘

银行信用卡风险大数据分析与挖掘 1、实验目的 中国某个商业银行高层发现自家信用卡存在严重的欺诈和拖欠现象,已经影响到自身经营和发展。银行高层希望大数据分析部门采用数据挖掘技术,对影响用户信用等级的主要因素进行分析,结合信用卡用户的人口特征属性对欺诈行为和拖欠…

顶顶通呼叫中心中间件-外呼通道变量同步到坐席通道变量(mod_cti基于Freeswitch)

机器人伴随转人工或者排队转人工 把外呼通道同步到坐席通道变量 在拨号方案转人工动作cti_acd,或者转机器人动作cti_rotobt的前面,添加一个 export nolocal:变量名${变量名} 一、配置拨号方案 win-ccadmin配置方法 点击拨号方案 -> 点击进入排队 -> 根据图…

Java项目:基于SSM框架实现的中小企业人力资源管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小企业人力资源管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简…

智能生产管理系统设计

智能生产管理系统的设计旨在提升制造业的效率、灵活性和响应速度,通过集成先进的信息技术(如物联网IoT、大数据分析、人工智能AI、云计算等)实现生产过程的智能化。以下是一些关键设计要素和步骤,用于构建一个高效的智能生产管理系…

jmeter-beanshell学习2-beanshell断言

继续写,之前写了获取变量,设置变量,今天先写个简单点的断言。 一般情况用响应断言,就挺好使,但是自动化还要生成报告,如果断言失败了,要保存结果,只能用beanshell处理,顺…

Ubuntu 24.04-自动安装-Nvidia驱动

教程 但在安全启动模式下可能会报错。 先在Nvidia官网找到GPU对应的驱动版, 1. 在软件与更新中选择合适的驱动 2. ubuntu自动安装驱动 sudo ubuntu-drivers autoinstall显示驱动 ubuntu-drivers devices3. 安装你想要的驱动 sudo apt install nvidia-driver-ve…