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隐藏标签和显示标签的实例
Nov 11 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
Oct 13 Javascript
AngularJS过滤器filter用法分析
Dec 11 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
使用react render props实现倒计时的示例代码
Dec 06 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
微信小程序实现弹出菜单动画
Jun 21 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
vue使用swiper.js重叠轮播组建样式
Nov 14 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 smtp实现发送邮件功能
2017/06/22 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
AngularJS基础知识
2014/12/21 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
python提取字典key列表的方法
2015/07/11 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
使用python去除图片白色像素的实例
2019/12/12 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
三八红旗手事迹材料
2014/12/26 职场文书
内乡县衙导游词
2015/02/05 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis