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 相关文章推荐
JavaScript 撑出页面文字换行
Jun 15 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
js函数模拟显示桌面.scf程序示例
Apr 20 Javascript
js获取ajax返回值代码
Apr 30 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
关于 jQuery Easyui异步加载tree的问题解析
Dec 06 Javascript
jquery+css实现简单的图片轮播效果
Aug 07 jQuery
JS获取当前地理位置的方法
Oct 25 Javascript
jQuery第一次运行页面默认触发点击事件的实例
Jan 10 jQuery
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 Javascript
基于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极大的增强功能和性能
2006/10/09 PHP
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
公司寄语大全
2014/04/10 职场文书
企业文化理念标语
2014/06/10 职场文书
关于旅游的活动方案
2014/08/15 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
防汛工作情况汇报
2014/10/28 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
导游词之太原天龙山
2020/01/02 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang