JavaScript reduce()方法详解与实现

2023-11-10

使用方法详解

reduce()方法在数组的每个元素上依次执行传入的‘reducer’回调函数,并传入上一次计算的返回值。第一次运行回调函数的时候没有‘上一次计算的返回值’。调用reduce()方法的时候可以传一个初始值来代替,否则,数组的第一个元素将被用作初始值,迭代从索引为1的元素开始。先看一个最简单的累加:

const array1 = [1, 2, 3, 4];

// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
  (previousValue, currentValue) => previousValue + currentValue,
  initialValue
);

console.log(sumWithInitial);
// expected output: 10

上述例子中,传给reduce()方法的回调函数,有两个参数previousValue,currentValue。这是最普遍的情况,实际上这个回调函数可以传入四个参数:

reduce(function(previousValue, currentValue, currentIndex, array) { /* … */ })
  • previousValue
    从命名就能看出来,这个参数代表上一次调用回调函数产生的值。第一次调用时,除非指定了initialValue,否则就是数组索引为0的值
  • currentValue
    当前元素的值,第一次调用时如果指定了initialValue,就为数组索引0的值,否则就为数组索引为1的值。
  • currentIndex
    当前元素的索引,第一次调用时如果指定了initialValue,就为0,否则为1
  • array
    正在遍历的数组

reduce()方法的第一个参数是上述的回调函数,还有第二个可选参数,就是initialValue,也就是在第一次调用回调函数时作为previousValue的值。

reduce()方法的返回值就是数组的最后一个元素运行回调函数完毕后的最终结果。

值得注意的点:

  1. 如果在reduce()开始遍历数组之后往数组里添加元素,回调函数不会遍历后加的元素
  2. 如果数组现有元素发生更改,传递给回调函数的值是reduce()第一次在数组上调用时的值
  3. reduce()调用后,开始遍历前删除的元素不会被reduce()访问

如果要计算对象数组中包含的值,必须提供一个初始值,以便函数遍历到每个元素,比如:

const objects = [{ x: 1 }, { x: 2 }, { x: 3 }];
const sum = objects.reduce(
  (previousValue, currentValue) => previousValue + currentValue.x,
  0,
);

console.log(sum); // 6

实现

Array.prototype.myReduce = function (callback) {
    // 获取初始值,如果有初始值,那就是第二个参数
    const initVal = arguments[1] ? arguments[1] : "";
    // 此处的this指向调用reduce的数组
    const len = this.length;
    // 没有初始值并且数组为空,报错
    if( !len && !initVal ) {
        throw Error('Reduce of empty array with no initial value');
    }
    // 数组为空,直接返回初始值
    if( !len )  return initVal;
    // 上次返回值,没初始值就是数组第一个元素
    let previousValue = initVal ? initVal : this[0];
    let currentIndex = initVal ? 0 : 1;
    for ( ; currentIndex < len; currentIndex++ ) {
        previousValue = callback(previousValue , this[currentIndex], currentIndex, this); // 每次执行回调返回的值赋值给total
    }
    return previousValue ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript reduce()方法详解与实现 的相关文章

  • javascript/jquery 从选择中删除或删除选项

    在某些情况下 我需要从选择中删除选项 基本上 if mystatement true remove item with id option1 from select of id select1 有人知道我可以实现这一目标的代码吗 非常感谢
  • 当内部元素滚动位置到达顶部/底部时防止父元素滚动?

    我有一个小 浮动工具箱 一个带有position fixed overflow auto 效果很好 但是 当在该框内滚动 使用鼠标滚轮 并到达底部或顶部时 父元素 接管 滚动请求 工具框后面的文档滚动 这很烦人 而不是用户 要求的 我正在使
  • 在 Node.js 中生成带条形码的 pdf

    我在用https github com devongovett pdfkit https github com devongovett pdfkit生成 PDF 文件 我可以简单地使用类似的方法 app get get pdf req re
  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • 获取被调用的 javascript 文件的查询字符串

    是否可以在调用的 javascript 文件上使用 javascript 获取查询参数 如下所示 in html in file js console log this location query 这是否可能以某种方式实现 或者我必须使用
  • 在上传之前预览图像 VUEjs [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但我不知道如何在vuejs中使用代码 我尝试了很多但没有任何结果 我还添加了我的代码 有人可以帮帮我吗 这是我的代码 谢谢 html
  • jQuery:查找具有特定自定义属性的元素

    我只想找到具有特定自定义属性值的元素 例如 我想找一个div其具有属性data divNumber 6 var number 6 var myDiv data divNumber number 我尝试使用http api jquery co
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • Chrome --app 相当于 Firefox\IE

    我有一个网络应用程序 客户要求单击不同按钮时更改浏览器窗口大小 我发现在那link https stackoverflow com questions 13436855 launch google chrome from the comma
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作

随机推荐

  • 【Springboot】——@EnableAsync@Async

    一直不太明白 线程池在实际应用当中到底扮演什么样的角色 有什么场景要用到 只有真正的项目设计的时候才能逐渐理解 实践出真知说的就是这么个道理 使用多线程 往往是创建Thread 或者是实现runnable接口 用到线程池的时候还需要创建Ex
  • [ Android实战 ] 通过uri删除文件

    Android通过 uri 删除文件 通过 file 开头的 uri 删除文件 通过 content 开头的 uri 删除文件 通过 ContentResolver delete 删除文件 通过 DocumentFile fromSingl
  • 硬核科普:一片晶圆可以生产多少芯片?

    视频来源 腾讯视频 原视频 52赫兹 点击查看往期内容 关注芯片之家 往期好文阅读 芯片之家精选文章合集 一 收藏起来慢慢看 芯片之家精选文章合集 二 收藏起来慢慢看 点击阅读
  • ios 卡顿,push多次同一个页面

    场景 快速多次点击cell跳转到另一个页面 另一个页面被push多次 原因 push后的页面有耗时操作或者刚好push到另一个页面时 另一个页面正好在reloadData卡住主线程 造成点击cell时卡住了 解决方法 重写导航控制器的pus
  • 如何通过SSH连接阿里云上的Linux系统

    亲测可用 若有疑问请私信 首先SSH是啥 维基一下 Secure Shell 安全外壳协议 简称SSH 是一种加密的网络传输协议 可在不安全的网络中为网络服务提供安全的传输环境 1 SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之
  • 01、win10下Apache 2.4.29+PHP 7.2.3+MySQL 5.7.21免安装开发环境配置

    一 软件下载 Apache2 4 29下载 下载地址 下载教程 PHP7 2 3下载 下载地址 下载教程 注意 一定要下载php 5 5 thread safe版本的 不然在后边没有要用到的php5apache2 4 dll库 MySQL5
  • android知识点 020 —— 版本信息,Android.os.Build 常用类

    1 Build VERSION SDK INT 软件app安装在哪个手机上 该手机的操作系统版本号 比如8 1对应的SDK INT是27 The SDK version of the software currently running o
  • qt案例-播放暂停动图

    wigdet h ifndef WIDGET H define WIDGET H include
  • MAC 查看程序安装目录

    查看程序安装目录 ps ef grep 程序名字 e g ps ef grep matlab
  • python中math库最大值_Python之math库和random库

    import math 相关函数 math ceil x x向上取最近的整数 然后返回这个整数 例 ceil 2 1 3 math degrees x 将x从弧度转换成角度 math fabs x 将x看作一个浮点数 返回它的绝对值 例 f
  • memcach基础知识--1

    memcache 1 memcache数据访问模型 首次访问从数据库查询 这是memcache 的模型 我们可以通过整合spring 来实现自己的数据同步机制 2 memcache 是相互之间乎不通信的分布式 memcache的分布式是完全
  • 电脑的任务栏卡,但是桌面可以正常使用

    这个的任务栏卡的原因可能如下 1 电脑后台运行过多的任务 占用过多c盘资源 导致任务栏卡死 解决方法 关掉多余的任务栏 2 也有可能是因为自己的windows更新 更新之后 任务栏 gt 右键 gt 资讯与兴趣 因为这个资讯与兴趣导致的任务
  • Python项目:The Ship Rendezvous Problem,利用贪心算法解决船舶交会问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 Python利用贪心算法解决船舶交会问题 1 Introduction 2 Python Task Greedy Heuristic for the SRP Function
  • TCP/IP协议基础知识

    作者 QQ群 852283276 微信 arm80x86 微信公众号 青儿创客基地 B站 主页 https space bilibili com 208826118 参考 TCP IP详解卷1 协议 网络七层协议 Wireshark 分析p
  • E58F8D476F6F676C65E5B0B1E698AFE58F8DE4BABAE7B1BB

    111001101011001110111110111001101011100010101101111001101010111010001010111010011000000010010100111001001011100010000000
  • 二值图像与灰度图像的区别

    二值图像 二值图像是指每个像素不是黑 就是白 其灰度值没有中间过渡的图像 这种图像又称为黑白图像 二值图像的每一个像素只有两个值0和1 其中0表示黑色 1表示白色 所以二值图都是长这样的 因为二值图每个像素只有两个值 所以每个像素只需要1b
  • 【整理】BIOS、BootLoader、uboot对比

    bios BIOS是英文 Basic Input Output System 的缩略语 直译过来后中文名称就是 基本输入输出系统 其实 它是一组固化到计算机内主板上一个ROM芯片上的程序 它保存着计算机最重要的基本输入输出的程序 系统设置信
  • Flutter ListView ListView.build ListView.separated

    理解为ListView 的三种形式吧 ListView 默认构造 但是这种方式创建的列表存在一个问题 对于那些长列表或者需要较昂贵渲染开销的子组件 即使还没有出现在屏幕中但仍然会被ListView所创建 这将是一项较大的开销 使用不当可能引
  • 在多态中,析构函数中的virtual与override用法介绍

    在C 中 析构顺序总是先析构派生类 再析构基类 介绍 如果基类的析构函数没有声明为virtual 当使用基类指针 或引用 删除派生类对象时 可能只会调用基类的析构函数 而不会调用派生类的析构函数 这会导致派生类的资源没有被正确释放 从而产生
  • JavaScript reduce()方法详解与实现

    使用方法详解 reduce 方法在数组的每个元素上依次执行传入的 reducer 回调函数 并传入上一次计算的返回值 第一次运行回调函数的时候没有 上一次计算的返回值 调用reduce 方法的时候可以传一个初始值来代替 否则 数组的第一个元