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.alert 弹出式复选框实现代码
Jun 15 Javascript
通过jQuery源码学习javascript(二)
Dec 27 Javascript
js/jquery解析json和数组格式的方法详解
Jan 09 Javascript
js读取csv文件并使用json显示出来
Jan 09 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
webpack入门+react环境配置
Feb 08 Javascript
js禁止浏览器页面后退功能的实例(推荐)
Sep 01 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
Sep 26 Javascript
基于Vue和Element-Ui搭建项目的方法
Sep 06 Javascript
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 Javascript
vue使用watch监听属性变化
Apr 30 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 显示指定路径下的图片
2009/10/29 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
python 数据加密代码
2008/12/24 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python小白垃圾回收机制入门
2020/06/09 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
Python内置函数及功能简介汇总
2020/10/13 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
canvas烟花特效锦集
2018/01/17 HTML / CSS
医学院四年学习生活的自我评价
2013/11/06 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
一年级班主任感言
2014/03/08 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
2014年教师节活动总结
2014/08/29 职场文书
设备收款委托书范本
2014/10/02 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python