详解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 Undefined,Null类型和NaN值区别
Oct 22 Javascript
js保留两位小数使用toFixed实现
Jul 29 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
jquery树形菜单效果的简单实例
Jun 06 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
Sep 12 Javascript
微信小程序访问node.js接口服务器搭建教程
Apr 25 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
浅谈node的事件机制
Oct 09 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 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 id 实现session共享和登录验证的代码
2012/06/03 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
javascript hashtable实现代码
2009/10/13 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
react高阶组件添加和删除props
2019/04/26 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
python读取二进制mnist实例详解
2017/05/31 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
详解python中的Turtle函数库
2018/11/19 Python
python如何制作缩略图
2019/04/30 Python
int在python中的含义以及用法
2019/06/27 Python
python代码能做成软件吗
2020/07/24 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
python 实现Harris角点检测算法
2020/12/11 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
接待员岗位责任制
2014/02/10 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
三八妇女节活动总结
2014/05/04 职场文书
护理见习报告范文
2014/11/03 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技