JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
本文实例讲述了JavaScript函数式编程(FunctionalProgramming)组合函数(Composition)用法。分享给大家供大家参考,具体如下:
组合(Composition)函数,就是把两个或以上的函数组合到一块儿,整成一个新的函数。我找到了一个很好的例子,很好地解释了组合函数这个概念。
比如一个应用主要是记录一下日常的花销(expenses),应用里的数据看起来像这样:
constexpenses=[ { name:'租金', price:3000, type:'日常' }, { name:'阿里云服务', price:600, type:'服务' }, { name:'健身中心', price:50, type:'健康' }, { name:'水电', price:100, type:'日常' } ];
合计花销
现在我要合计一下所有花销,创建一个函数,用一下map与reduce,这个函数像这样:
constsum=(source)=> source .map((item)=>item.price) .reduce((accumulator,price)=>accumulator+price,0)
sum这个函数接收一个source参数,在函数里,先用map,返回source里的所有的price(价格)。然后再用reduce去处理返回的price,这里就是合计所有的price的值。
这个函数用起来像这样:
lettotal=sum(expenses)//结果:3750
组合
现在我要合计一下我在某个类别下花的钱。比如我要合计一下“日常”这个分类里花的钱。先创建一个函数,可以返回所有“日常”类型的花销。
const=getHousehold=(source)=>{ returnsource.filter((item)=>item.type==='日常') }
getHousehold函数里用了filter,它可以过滤出满足特定条件的项目。这里就是把type的值是“日常”的项目过滤出来。
现在如果我想得到“日常”类型的花销的合计的结果,可以这样:
lethouseholdExpenses=sum(getHousehold(expenses)) //结果:3100
上面,我们先用getHousehold函数得到所有的“日常”类型的项目,然后又用sum函数合计了得到的结果。最终返回的就是所有“日常”类型的项目的合计花销。
根据上面的使用,我们可以去创建一个组合函数,这个函数可以去合计“日常”类型的项目的花销。先创建一个组合函数用的函数:
constcompose=(function1,function2)=>{ return(source)=>function2(function1(source)) }
现在我们可以用创建的这个compose函数去组合两个函数:
constsumHousehold=compose(getHousehold,sum)
sumHousehold就是一个组合,它组合了getHousehold还有sum。现在如果你提供给sumHousehold一组数据,比如最开始我们定义的expenses,首先会用getHousehold得到所有“日常”类型的项目,然后再用sum去合计这些项目。
sumHousehold(expenses)
新任务
我现在要得到花销数据里的所有的分类:
constgetCategories=(source)=>{ returnsource.map((item)=>item.type) }
用一下这个函数:
getCategories(expenses) //["日常","服务","健康","日常"]
在返回的结果里,“日常”这个分类出现了两次。我们再去创建一个函数可以得到唯一的项目:
constuniqueElement=(source)=>{ returnsource.filter((item,position)=>{ returnsource.indexOf(item)===position }) }
现在我们再去创建一个组合函数:
constuniqueCategories=compose(getCategories,uniqueElement)
uniqueCategories这个函数组合了getCategories还有uniqueElement函数。你交给uniqueCategories的数据,会先被getCategories处理,它会得到所有的分类,然后这些分类又会被uniqueElement处理,这个函数可以得以唯一的项目。
uniqueCategories(expenses) //["日常","服务","健康"]
完整的代码
//应用里的数据 constexpenses=[ { name:'租金', price:3000, type:'日常' },{ name:'阿里云服务', price:600, type:'服务' },{ name:'健身中心', price:50, type:'健康' },{ name:'水电', price:100, type:'日常' } ]; //合计数据里的price constsum=(source)=> source .map((item)=>item.price) .reduce((accumulator,price)=>accumulator+price,0) //得到数据里类型是“日常”的所有项目 constgetHousehold=(source)=> source .filter((item)=>item.type==='日常') //合计结果 lettotal=sum(expenses) console.log(total) //合计“日常”类型的花费 lethouseholdExpenses=sum(getHousehold(expenses)) console.log(householdExpenses) //创建组合函数用的函数 constcompose=(function1,function2)=>{ return(source)=>function2(function1(source)) } //创建一个组合函数,可以合计“日常”类型的花费 constsumHousehold=compose(getHousehold,sum) console.log(sumHousehold(expenses)) //得到数据里的所有分类 constgetCategories=(source)=>{ returnsource.map((item)=>item.type) } console.log(getCategories(expenses)) //返回一个数组里的唯一元素 constuniqueElement=(source)=>{ returnsource.filter((item,position)=>{ returnsource.indexOf(item)===position }) } //创建一个组合函数,可以返回数据里的唯一分类 constuniqueCategories=compose(getCategories,uniqueElement) console.log(uniqueCategories(expenses))
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。