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 .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
javascript定义函数的方法
Dec 06 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
jQuery实现给页面换肤的方法
May 30 Javascript
js和jquery分别验证单选框、复选框、下拉框
Dec 17 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
Mar 04 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
Angularjs为ng-click事件传递参数
Jun 15 Javascript
通过命令行生成vue项目框架的方法
Jul 12 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
收音机的保养
2021/03/01 无线电
Yii框架中memcache用法实例
2014/12/03 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
php实现微信支付之现金红包
2018/05/30 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
Javascript函数的参数
2015/07/16 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
JavaScript实现答题评分功能页面
2020/06/24 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
OpenCV 边缘检测
2019/07/10 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
上党课的心得体会
2014/09/02 职场文书
付款承诺函范文
2015/01/21 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
element tree树形组件回显数据问题解决
2022/08/14 Javascript