详解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 相关文章推荐
网页自动跳转代码收集
Sep 27 Javascript
jquery多选项卡效果实例代码(附效果图)
Mar 23 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
JavaScript运算符小结
Jun 03 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
jQuery实现的背景颜色渐变动画效果示例
Mar 24 jQuery
为JQuery EasyUI 表单组件增加焦点切换功能的方法
Apr 13 jQuery
Bootstrap与Angularjs的模态框实例代码
Aug 03 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
微信接入之获取用户头像的方法步骤
Sep 23 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存储过程
2007/02/14 PHP
PHP5函数小全(分享)
2013/06/06 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
js实现进度条的方法
2015/02/13 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
python实现K最近邻算法
2018/01/29 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Django通过json格式收集主机信息
2020/05/29 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
详解rem 适配布局
2018/10/31 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
Linux内核产生并发的原因
2012/07/13 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
市场部规章制度
2014/01/24 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
1亿有多大教学反思
2014/05/01 职场文书
企业安全标语
2014/06/07 职场文书
天地会口号
2014/06/17 职场文书
合作意向书
2014/07/30 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
JavaScript中reduce()的用法
2022/05/11 Javascript