详解JavaScript之Array.reduce源码解读


Posted in Javascript onNovember 01, 2020

前言

reduce(...)方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值(累计作用)

此方法接受两个参数:callback(...)(必选)、initialValue(可选)。
callback(...)接受4个参数:Accumulator (acc) (累计器)、Current Value (cur) (当前值)、Current Index (idx) (当前索引)、Source Array (src) (源数组)。

注意点:
1、callback(...)一般需要返回值
2、不会改变原数组

实现思路
1、先获取初始累计的值(分成两种情况:有提供initialValue || 未提供initialValue)
2、遍历数组并执行callback(...)
3、返回累计值

源码实现

Array.prototype.myReduce = function(callback, initialValue) {
 if(this === null) {
  throw new TypeError( 'Array.prototype.reduce called on null or undefined' );
 }
 if (typeof callback !== 'function') {
  throw new TypeError( callback + ' is not a function');
 }
 const O = Object(this);
 const lenValue = O.length;
 const len = lenValue >>> 0;
 if(len === 0 && !initialValue) {
  throw new TypeError('the array contains no elements and initialValue is not provided');
 }
 let k = 0;
 let accumulator;
 // 分成两种情况来获取accumulator
 // 有提供initialValue accumulator=initialValue
 // 没有提供initialValue accumulator=数组的第一个有效元素
 if(initialValue) {
  accumulator = initialValue;
 } else {
  let kPressent = false;
  while(!kPressent && k < len) {
   const pK = String(k);
   kPressent = O.hasOwnProperty(pK);
   if(kPressent) {
    accumulator = O[pK];
   };
   k++;
  }
  if(!kPressent) {
   throw new TypeError('the array contains error elements');
  }
 }
 // 当accumulator=initialValue时 k=0
 // accumulator=数组的第一个有效元素时 k=1
 while(k < len) {
  if(k in O) {
   // callback一般需要返回值
   accumulator = callback(accumulator, O[k], k, O);
  }
  k++;
 }
 return accumulator;
}
let r = [1,2,3].myReduce(function (prevValue, currentValue, currentIndex, array) {
 return prevValue + currentValue;
}, 22);
console.log(r); // 28

参考链接:

reduce-mdn
官方规范

到此这篇关于详解JavaScript之Array.reduce源码解读的文章就介绍到这了,更多相关JavaScript Array.reduce源码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
几个高效,简洁的字符处理函数
Apr 12 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
Aug 14 Javascript
基于jQuery实现图片的前进与后退功能
Apr 24 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
jQuery插件支持同一页面被多次调用
Feb 14 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
Sep 18 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
jQuery EasyUI window窗口使用实例代码
Dec 25 jQuery
js判断文件类型大小并给出提示的实现方法
Jan 03 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
Sep 30 Javascript
微信小程序实现星星评分效果
Nov 01 #Javascript
Express 配置HTML页面访问的实现
Nov 01 #Javascript
ant design vue 表格table 默认勾选几项的操作
Oct 31 #Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 #Javascript
Ant design vue中的联动选择取消操作
Oct 31 #Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 #Javascript
vue中可编辑树状表格的实现代码
Oct 31 #Javascript
You might like
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
JS之相等操作符详解
2016/09/13 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
js实现录音上传功能
2019/11/22 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
基于python检查矩阵计算结果
2020/05/21 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
博士学位自我鉴定范文
2013/12/26 职场文书
幼儿教师工作感言
2014/02/14 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
学生安全责任书模板
2014/07/25 职场文书
个人自荐书范文
2015/03/09 职场文书
圣诞晚会主持词
2015/07/01 职场文书
思想工作总结范文
2015/08/12 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis