当前位置: 首页 > ai >正文

数据结构与算法学习-JavaScript的Array.prototype.reduce()方法

一、语法

array.reduce(callbackfn, initialValue);callbackfn =(accumulator, currentValue, currentIndex, array) => {// 回调逻辑
}
callbackFn

为数组中每个元素执行的函数。

其返回值将作为下一次调用 callbackFn 时的 accumulator 参数。对于最后一次调用,返回值将作为 reduce() 的返回值。

currentValue

当前元素的值。

在第一次调用时,若指定了 initialValue,则为 array[0] 的值,否则为 array[1]。(若未指定 initialValue, array[0] 的值将充当initialValue

currentIndex

currentValue 在数组中的索引位置。

在第一次调用时,如果指定了 initialValue 则为 0,否则为 1

 initialValue

第一次调用回调时初始化 accumulator 的值。

如果指定了 initialValue,则 callbackFn 从数组中的第一个值(即 array[0])作为 currentValue 开始执行。如果没有指定 initialValue,则 accumulator 初始化为数组中的第一个值,并且 callbackFn 从数组中的第二个值(即 array[1])作为 currentValue 开始执行。在这种情况下,如果数组为空(没有第一个值可以作为 accumulator 返回),则会抛出错误。

二、示例

1、打印所有参数

const numbers = [10, 20, 30];numbers.reduce((acc, curr, idx, arr) => {console.log({accumulator: acc,currentValue: curr,currentIndex: idx,array: arr,});return acc + curr; // 累加求和
}, 0);
{accumulator: 0,       // 初始值currentValue: 10,     // 第一个元素currentIndex: 0,      // 第一个索引array: [10, 20, 30]   // 原数组
}
{accumulator: 10,      // 上一轮返回值 (0 + 10)currentValue: 20,     // 第二个元素currentIndex: 1,      // 第二个索引array: [10, 20, 30]
}
{accumulator: 30,      // 上一轮返回值 (10 + 20)currentValue: 30,     // 第三个元素currentIndex: 2,      // 第三个索引array: [10, 20, 30]
}

最终返回值:6010 + 20 + 30)。

 二、统计数组中每个元素的出现次数,并返回一个对象(键为元素值,值为出现次数)

const names = ["Alice", "Bob", "Tiff", "Bruce", "Alice"];const countedNames = names.reduce((allNames, name) => {const currCount = allNames[name] ?? 0; // 获取当前名字的计数(若不存在则为 0)return {...allNames, // 复制原对象的所有属性[name]: currCount + 1, // 更新当前名字的计数};
}, {}); // 初始值为空对象 {}
第一轮
  • allNames = {}(初始值)
  • name = "Alice"
  • currCount = allNames["Alice"] ?? 0 → undefined ?? 0 → 0
  • 返回:

    { ...{}, "Alice": 0 + 1 }

    → { "Alice": 1 }
第二轮
  • allNames = { "Alice": 1 }
  • name = "Bob"
  • currCount = allNames["Bob"] ?? 0 → undefined ?? 0 → 0
  • 返回:

    { ...{ "Alice": 1 }, "Bob": 0 + 1 }

    → { "Alice": 1, "Bob": 1 }
第三轮
  • allNames = { "Alice": 1, "Bob": 1 }
  • name = "Tiff"
  • currCount = allNames["Tiff"] ?? 0 → undefined ?? 0 → 0
  • 返回:

    { ...{ "Alice": 1, "Bob": 1 }, "Tiff": 0 + 1 }

    → { "Alice": 1, "Bob": 1, "Tiff": 1 }
第四轮
  • allNames = { "Alice": 1, "Bob": 1, "Tiff": 1 }
  • name = "Bruce"
  • currCount = allNames["Bruce"] ?? 0 → undefined ?? 0 → 0
  • 返回:

    { ...{ "Alice": 1, "Bob": 1, "Tiff": 1 }, "Bruce": 0 + 1 }

    → { "Alice": 1, "Bob": 1, "Tiff": 1, "Bruce": 1 }
第五轮
  • allNames = { "Alice": 1, "Bob": 1, "Tiff": 1, "Bruce": 1 }
  • name = "Alice"
  • currCount = allNames["Alice"] ?? 0 → 1 ?? 0 → 1
  • 返回:

    { ...{ "Alice": 1, "Bob": 1, "Tiff": 1, "Bruce": 1 }, "Alice": 1 + 1 }

    → { "Alice": 2, "Bob": 1, "Tiff": 1, "Bruce": 1 }

最终结果

{ "Alice": 2, "Bob": 1, "Tiff": 1, "Bruce": 1 }

关键点

  1. ?? 运算符(空值合并运算符)​

    (1)如果左侧操作数为 null 或 undefined,返回右侧操作数;否则返回左侧操作数。(2)在这里用于处理名字第一次出现时 allNames[name] 为 undefined 的情况。
  2. ​展开运算符 ...

    复制原对象的所有属性,避免直接修改原对象(保持不可变性)。
  3. ​动态键名 [name]

    使用计算属性名语法,将变量 name 的值作为对象的键。
  4. ​初始值 {} 的作用​

    确保累加器从空对象开始,避免未定义行为。

三、题目

1991. 找到数组的中间位置 - 力扣(LeetCode)

数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

http://www.xdnf.cn/news/5572.html

相关文章:

  • 23.第二阶段x64游戏实战-分析背包物品数量
  • 麒麟系统安装.net core环境变量
  • 从实战看软件测试与质量管理:方法、过程与质量的全景解读
  • 【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函数
  • DocsGPT 远程命令执行漏洞复现(CVE-2025-0868)
  • 【ASR学习笔记】:语音识别领域基本术语
  • 链表面试题6之回文结构
  • OpenCVCUDA 模块中在 GPU 上对图像或矩阵进行 边界填充(padding)函数copyMakeBorder()
  • -MAC桢-
  • Qt中解决UI线程阻塞导致弹窗无法显示的两种方法
  • Linux复习笔记(三) 网络服务配置(web)
  • Flask如何读取配置信息
  • FFmpeg 项目中的三大核心工具详解
  • 【HarmonyOS 5】鸿蒙App Linking详解
  • 【Web/HarmonyOS】采用ArkTS+Web组件开发网页嵌套的全屏应用
  • labview硬件采集卡驱动安装
  • Spark目前支持的部署模式。
  • 【ZYNQ Linux移植】5-根文件系统移植
  • C++匿名函数
  • Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
  • MyBatis 动态 SQL 核心标签教程:_if_, _where_, _foreach_
  • 第六节第一部分:认识抽象类及其好处
  • 字节高效图像定制生成模型框架:DreamO论文速读
  • 【数据结构】map_set前传:二叉搜索树(C++)
  • Window、CentOs、Ubuntu 安装 docker
  • 学习黑客5 分钟深入浅出理解Windows System Configuration
  • 【免费】2005-2018年各省人均财政收支数据
  • Qt for Android申请允许管理所有文件权限
  • n8n 修改或者智能体用文档知识库创建pdf
  • SSRF相关