详解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帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
锋利的jQuery 第三章章节总结的例子
Mar 23 Javascript
jquery中this的使用说明
Sep 06 Javascript
JS字符串处理实例代码
Aug 05 Javascript
jquery 追加tr和删除tr示例代码
Sep 12 Javascript
js实现表单Radio切换效果的方法
Aug 17 Javascript
详解express与koa中间件模式对比
Aug 07 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
如何使用vuex实现兄弟组件通信
Nov 02 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
Nov 13 Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
Oct 22 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP类型约束用法示例
2016/09/28 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python转换摩斯密码示例
2014/02/16 Python
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python单例模式的两种实现方法
2017/08/14 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
python中get和post有什么区别
2020/06/19 Python
英国领先的游戏零售商:GAME
2019/09/24 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
楚门的世界观后感
2015/06/03 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL
Nginx的gzip相关介绍
2022/05/11 Servers