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 json2 使用方法
Mar 16 Javascript
JQuery小知识
Oct 15 Javascript
javascript白色简洁计算器
May 04 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
jQuery 如何实现一个滑动按钮开关
Dec 01 Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
基于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数据饼图效果实现代码
2011/11/23 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
专科毕业生求职简历的自我评价
2013/10/12 职场文书
个人函授自我鉴定
2014/03/25 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python