Javascript中内建函数reduce的应用详解


Posted in Javascript onOctober 20, 2016

前言

一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实现,虽然不清楚浏览器的js引擎是如何在C++层面实现这两个方法,但是可以肯定的是reduce方法肯定也存在数组的遍历,在具体实现细节上是否针对数组项的操作和存储做了什么优化,则不得而知。

数组的reduce方法的应用

reduce方法有两个参数,第一个参数是一个callback,用于针对数组项的操作;第二个参数则是传入的初始值,这个初始值用于单个数组项的操作。需要注意的是,reduce方法返回值并不是数组,而是形如初始值的经过叠加处理后的操作。

reduce方法最常见的场景就是叠加。

var items = [10, 120, 1000];

// our reducer function
var reducer = function add(sumSoFar, item) { return sumSoFar + item; };

// do the job
var total = items.reduce(reducer, 0);

console.log(total); // 1130

可以看出,reduce函数根据初始值0,不断的进行叠加,完成最简单的总和的实现。

前文中也提到,reduce函数的返回结果类型和传入的初始值相同,上个实例中初始值为number类型,同理,初始值也可为object类型。

var items = [10, 120, 1000];

// our reducer function
var reducer = function add(sumSoFar, item) {
 sumSoFar.sum = sumSoFar.sum + item;
 return sumSoFar;
};

// do the job
var total = items.reduce(reducer, {sum: 0});

console.log(total); // {sum:1130}

多重叠加

使用reduce方法可以完成多维度的数据叠加。如上例中的初始值{sum: 0} ,这仅仅是一个维度的操作,如果涉及到了多个属性的叠加,如{sum: 0,totalInEuros: 0,totalInYen: 0} ,则需要相应的逻辑进行处理。

在下面的方法中,采用分而治之的方法,即将reduce函数第一个参数callback封装为一个数组,由数组中的每一个函数单独进行叠加并完成reduce操作。所有的一切通过一个manager函数来管理流程和传递初始参数。

var manageReducers = function(reducers) {
 return function(state, item) {
 return Object.keys(reducers).reduce(
  function(nextState, key) {
  reducers[key](state, item);
  return state;
  },
  {}
 );
 }
};

上面就是manager函数的实现,它需要reducers对象作为参数,并返回一个callback类型的函数,作为reduce的第一个参数。在该函数内部,则执行多维的叠加工作( Object.keys() )。

通过这种分治的思想,可以完成目标对象多个属性的同时叠加,完整代码如下:

var reducers = { 
 totalInEuros : function(state, item) {
 return state.euros += item.price * 0.897424392;
 },
 totalInYen : function(state, item) {
 return state.yens += item.price * 113.852;
 }
};

var manageReducers = function(reducers) {
 return function(state, item) {
 return Object.keys(reducers).reduce(
  function(nextState, key) {
  reducers[key](state, item);
  return state;
  },
  {}
 );
 }
};

var bigTotalPriceReducer = manageReducers(reducers);

var initialState = {euros:0, yens: 0};

var items = [{price: 10}, {price: 120}, {price: 1000}];

var totals = items.reduce(bigTotalPriceReducer, initialState);

console.log(totals);

总结

以上就是Javascript中内建函数reduce应用的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
通过jquery还原含有rowspan、colspan的table的实现方法
Feb 10 Javascript
用jquery方法操作radio使其默认选项是否
Sep 10 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
Angularjs整合微信UI(weui)
Mar 15 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
jQuery子选择器与可见性选择器实例分析
Jun 28 jQuery
基于AngularJS前端云组件最佳实践
Oct 20 #Javascript
分享javascript、jquery实用代码段
Oct 20 #Javascript
基于原生js淡入淡出函数封装(兼容IE)
Oct 20 #Javascript
纯JavaScript手写图片轮播代码
Oct 20 #Javascript
Zabbix添加Node.js监控的方法
Oct 20 #Javascript
Javascript实现图片懒加载插件的方法
Oct 20 #Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 #Javascript
You might like
PHP 批量删除 sql语句
2009/06/05 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
jQuery插件开发全解析
2012/10/10 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python实现simhash算法实例
2014/04/25 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
基于pip install django失败时的解决方法
2018/06/12 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
Python列表操作方法详解
2020/02/09 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
HTML5标签小集
2011/08/02 HTML / CSS
法国在线药房:DoctiPharma
2020/10/21 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
户外婚礼策划方案
2014/02/08 职场文书
团日活动总结怎么写
2014/06/25 职场文书
责任书格式范文
2014/07/28 职场文书
工作说明书格式
2014/07/29 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书