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 相关文章推荐
jqTransform form表单美化插件使用方法
Jul 05 Javascript
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
JSONP之我见
Mar 24 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
setTimeout学习小结
Feb 08 Javascript
一道面试题引发的对javascript类型转换的思考
Mar 06 Javascript
利用Decorator如何控制Koa路由详解
Jun 26 Javascript
微信小程序列表中item左滑删除功能
Nov 07 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 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
用cookies来跟踪识别用户
2006/10/09 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python入门篇之文件
2014/10/20 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python的时间模块datetime详解
2017/04/17 Python
python中的colorlog库使用详解
2019/07/05 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
学员自我鉴定
2014/03/19 职场文书
小学班主任寄语大全
2014/04/04 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
python 如何在list中找Topk的数值和索引
2021/05/20 Python
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android