详解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 相关文章推荐
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
下拉框select的绑定示例
Sep 04 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
js制作支付倒计时页面
Oct 21 Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
React Router v4 入坑指南(小结)
Apr 08 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
js html实现计算器功能
Nov 13 Javascript
深入了解query和params的使用区别
Jun 24 Javascript
js prototype深入理解及应用实例分析
Nov 25 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非常实用的功能
2015/09/29 PHP
php正则修正符用法实例详解
2016/12/29 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
JS获取父节点方法
2009/08/20 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
Python如何判断数独是否合法
2016/09/08 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
浅谈Python协程
2020/06/17 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
什么是属性访问器
2015/10/26 面试题
Why do we need Unit test
2013/01/03 面试题
自我评价个人范文
2013/12/16 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
小学教师事迹材料
2014/01/13 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
企业宣传语大全
2015/07/13 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
用JS写一个发布订阅模式
2021/11/07 Javascript
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js