详解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 相关文章推荐
Array对象方法参考
Oct 03 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
ExtJS[Desktop]实现图标换行示例代码
Nov 17 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
JavaScript运算符小结
Jun 03 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
node.js Promise对象的使用方法实例分析
Dec 26 Javascript
javascript中正则表达式语法详解
Aug 07 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
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
Python实现Const详解
2015/01/27 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python对wav文件的重采样实例
2020/02/25 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
物业工作计划书
2014/01/10 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
大家访活动实施方案
2014/03/10 职场文书
学习决心书
2014/03/11 职场文书
医院院务公开实施方案
2014/05/03 职场文书
党员承诺书怎么写
2014/05/20 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
职工年度考核评语
2014/12/31 职场文书
安全保证书怎么写
2015/02/28 职场文书
单位接收证明格式
2015/06/18 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
HttpClient实现表单提交上传文件
2022/08/14 Java/Android