JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析


Posted in Javascript onMay 22, 2019

本文实例讲述了JavaScript函数式编程(Functional Programming)组合函数(Composition)用法。分享给大家供大家参考,具体如下:

组合(Composition)函数,就是把两个或以上的函数组合到一块儿,整成一个新的函数。我找到了一个很好的例子,很好地解释了组合函数这个概念。

比如一个应用主要是记录一下日常的花销(expenses),应用里的数据看起来像这样:

const expenses = [
 {
  name: '租金',
  price: 3000,
  type: '日常'
 }, 
 {
  name: '阿里云服务',
  price: 600,
  type: '服务'
 }, 
 {
  name: '健身中心',
  price: 50,
  type: '健康'
 }, 
 {
  name: '水电',
  price: 100,
  type: '日常'
 }
];

合计花销

现在我要合计一下所有花销,创建一个函数,用一下 map 与 reduce,这个函数像这样:

const sum = (source) => 
 source
  .map((item) => item.price)
  .reduce((accumulator, price) => accumulator + price, 0)

sum 这个函数接收一个 source 参数,在函数里,先用 map,返回 source 里的所有的 price(价格)。然后再用 reduce 去处理返回的 price ,这里就是合计所有的 price 的值。

这个函数用起来像这样:

let total = sum(expenses) // 结果:3750

组合

现在我要合计一下我在某个类别下花的钱。比如我要合计一下 “日常” 这个分类里花的钱。先创建一个函数,可以返回所有 “日常” 类型的花销。

const = getHousehold = (source) => {
 return source.filter((item) => item.type === '日常')
}

getHousehold 函数里用了 filter ,它可以过滤出满足特定条件的项目。这里就是把 type 的值是 “日常” 的项目过滤出来。

现在如果我想得到 “日常” 类型的花销的合计的结果,可以这样:

let householdExpenses = sum(getHousehold(expenses)) 
// 结果:3100

上面,我们先用 getHousehold 函数得到所有的 “日常” 类型的项目,然后又用 sum 函数合计了得到的结果。最终返回的就是所有 “日常” 类型的项目的合计花销。

根据上面的使用,我们可以去创建一个组合函数,这个函数可以去合计 “日常” 类型的项目的花销。先创建一个组合函数用的函数:

const compose = (function1, function2) => {
 return (source) => function2(function1(source))
}

现在我们可以用创建的这个 compose 函数去组合两个函数:

const sumHousehold = compose(getHousehold, sum)

sumHousehold 就是一个组合,它组合了 getHousehold 还有 sum。现在如果你提供给 sumHousehold 一组数据,比如最开始我们定义的 expenses,首先会用 getHousehold 得到所有 “日常” 类型的项目,然后再用 sum 去合计这些项目。

sumHousehold(expenses)

新任务

我现在要得到花销数据里的所有的分类:

const getCategories = (source) => {
 return source.map((item) => item.type)
}

用一下这个函数:

getCategories(expenses)
// ["日常", "服务", "健康", "日常"]

在返回的结果里,“日常” 这个分类出现了两次。我们再去创建一个函数可以得到唯一的项目:

const uniqueElement = (source) => {
 return source.filter((item, position) => {
  return source.indexOf(item) === position
 })
}

现在我们再去创建一个组合函数:

const uniqueCategories = compose(getCategories, uniqueElement)

uniqueCategories 这个函数组合了 getCategories 还有 uniqueElement 函数。你交给 uniqueCategories 的数据,会先被 getCategories 处理,它会得到所有的分类,然后这些分类又会被 uniqueElement 处理,这个函数可以得以唯一的项目。

uniqueCategories(expenses)
// ["日常", "服务", "健康"]

完整的代码

// 应用里的数据
const expenses = [
 {
  name: '租金',
  price: 3000,
  type: '日常'
 }, {
  name: '阿里云服务',
  price: 600,
  type: '服务'
 }, {
  name: '健身中心',
  price: 50,
  type: '健康'
 }, {
  name: '水电',
  price: 100,
  type: '日常'
 }
];
// 合计数据里的 price
const sum = (source) =>
 source
  .map((item) => item.price)
  .reduce((accumulator, price) => accumulator + price, 0)
// 得到数据里类型是 “日常” 的所有项目
const getHousehold = (source) =>
 source
  .filter((item) => item.type === '日常')
// 合计结果
let total = sum(expenses)
console.log(total)
// 合计 “日常” 类型的花费
let householdExpenses = sum(getHousehold(expenses))
console.log(householdExpenses)
// 创建组合函数用的函数
const compose = (function1, function2) => {
 return (source) => function2(function1(source))
}
// 创建一个组合函数,可以合计 “日常” 类型的花费
const sumHousehold = compose(getHousehold, sum)
console.log(sumHousehold(expenses))
// 得到数据里的所有分类
const getCategories = (source) => {
 return source.map((item) => item.type)
}
console.log(getCategories(expenses))
// 返回一个数组里的唯一元素
const uniqueElement = (source) => {
 return source.filter((item, position) => {
  return source.indexOf(item) === position
 })
}
// 创建一个组合函数,可以返回数据里的唯一分类
const uniqueCategories = compose(getCategories, uniqueElement)
console.log(uniqueCategories(expenses))

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js href的用法
May 13 Javascript
用JQuery在网页中实现分隔条功能的代码
Aug 09 Javascript
关于angularJs指令的Scope(作用域)介绍
Oct 25 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
js实现图片加载淡入淡出效果
Apr 07 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
swiper实现导航滚动效果
Dec 13 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
Dec 29 Javascript
微信小程序实现聊天室功能
Jun 14 Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 #Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 #Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 #Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 #Javascript
详解在React-Native中持久化redux数据
May 22 #Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 #Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 #Javascript
You might like
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
基于mysql的论坛(1)
2006/10/09 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
JS定时器实例
2013/04/17 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
详解vue后台系统登录态管理
2019/04/02 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
百货商场楼层班组长竞聘书
2014/03/31 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server