详解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 相关文章推荐
Javascript typeof 用法
Dec 28 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
Mar 21 Javascript
初窥JQuery(二)事件机制(2)
Dec 06 Javascript
JS实现图片平面旋转的方法
Mar 01 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
js实现返回顶部效果
Mar 10 Javascript
React Native实现进度条弹框的示例代码
Jul 17 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
Jan 18 Javascript
vue实现点击追加选中样式效果
Nov 01 Javascript
jQuery实现简单聊天室
Feb 08 jQuery
vue+canvas实现移动端手写签名
May 21 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
python模仿网页版微信发送消息功能
2018/02/24 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
python写日志文件操作类与应用示例
2019/07/01 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
python判断是空的实例分享
2020/07/06 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
运动会跳远加油稿
2014/02/20 职场文书
十一酒店活动方案
2014/02/20 职场文书
秘书英文求职信
2014/04/16 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书