详解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 相关文章推荐
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
Feb 27 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 Javascript
jQuery事件详解
Feb 23 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
vue组件通信传值操作示例
Jan 08 Javascript
JS字符串常用操作方法实例小结
Jun 24 Javascript
openlayers 3实现车辆轨迹回放
Sep 24 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
mysql limit查询优化分析
2008/11/12 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python读文件逐行处理的示例代码分享
2013/12/27 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
Python的形参和实参使用方式
2019/12/24 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
python实现五子棋程序
2020/04/24 Python
详解python datetime模块
2020/08/17 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
教师师德师风整改措施
2014/10/24 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
高中英语教学反思范文
2016/03/02 职场文书