前端开发之函数式编程实践
一、函数式编程简介
(资料图片)
常见应用场景
1、ES6中的map、filter、reduce等函数
[1,2,3,4,5].map(x => x * 2).filter(x => x > 5).reduce((p,n) => p + n);2、React类组件 -> 函数式组件+hooks、Vue3中的组合式API3、RxJS、Lodash和Ramda等JS库 4、中间件/插件,如Redux中的applyMiddleware中间件实现
const store = applyMiddleware(...middlewares)(createStore)(reducer, initialState)什么是函数式编程函数式编程是一种编程范式,它将程序抽象为函数和数据结构,通过函数调用来实现程序的功能,并且函数可以作为参数传递给其他函数。 在 JavaScript 中,函数式编程可以实现面向对象编程的一些功能,比如抽象、封装、继承和多态等。 它还可以使用高阶函数、柯里化、组合和延迟计算来实现函数式编程的功能。
函数式编程有哪些特性
函数是「一等公民」
函数可以当做参数传递给其他函数,也可以作为函数的返回值返回(高阶函数)。
惰性执行
惰性执行是指在代码中的某些函数调用,只有在它们的返回值被使用时才会被执行。
它利用了延迟计算的技术,使得函数只在被调用时才会执行,而不是在编写代码时就被执行。
这样可以提高性能,因为不需要无用的计算。
无副作用(纯函数)
函数的执行不会改变程序的外部状态,也就是说函数的执行不会影响程序的其他部分。
因为它只是单纯的计算结果,而不会产生其他的副作用。
二、常见函数式概念
柯里化-currying
柯里化函数是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 函数表达:f(a, b, c) => f(a)(b)(c) 简单实现(有兴趣的同学可以研究下Lodash和Ramda库中的实现)
// 函数柯里化function curry(fn, args){ args = args || [] return function(...params){ let _args = [...args, ...params] if(_args.length < fn.length){ return curry(fn, _args) } return fn.apply(this, _args) }}function sum(a, b, c){ return a+b+c}// 自由组合参数const currySum = curry(sum)console.log(currySum(1)(2)(3)) //6console.log(currySum(1)(2,3)) //6console.log(currySum(1,2)(3)) //6
管道-pipe
管道pipe函数是一个高阶函数,它接受一系列函数作为参数,将函数串联起来,一步步将上一步的输出作为下一步的输入,这样可以更加高效地处理复杂的业务逻辑。 函数表达:pipe(f, g, t) => x => t(g(f(x)),进一步结合curry可以实现pipe(f)(g)(t) => x => t(g(f(x)) 借助reduce简单实现,支持异步和非异步函数
export const pipe: any = (...fns: Promise[]) => (input: any) => fns.reduce((chain: Promise , func: Function | Promise | any) => chain.then(func), Promise.resolve(input));
组合-compose
组合compose指的是将多个函数组合成一个函数,这样一个函数的输出就可以作为另一个函数的输入,从而实现多个函数的链式调用。 组合compose可以提高代码的可读性和可维护性,减少重复代码的出现,更加便捷地实现函数的复用。 函数表达:compose(f, g, t) => x => f(g(t(x)),进一步结合curry可以实现compose(f)(g)(t) => x => f(g(t(x)) 借助reduceRight简单实现,和pipe的区别只是运算顺序不同
export const compose: any = (...fns: Promise三、函数式编程实践[]) => (input: any) => fns.reduceRight((chain: Promise , func: Function | Promise | any) => chain.then(func), Promise.resolve(input));
需求背景介绍
AgileBI在线报表是一款报表应用工具:易学易用,零代码,通过简单拖拽操作,制作中国式复杂报表,轻松实现报表的多样展示、交互分析、数据导出等需求, 在线体验 已有功能:在线报表中的每个单元格都可以配置相关的属性:比如扩展方向、父格、单元格格式、过滤条件、条件属性等 新增需求:需要支持批量设置单元格,其中【文本类型】单元格支持扩展方向、父格的设置;【字段类型】、【公示类型】单元格支持所有配置;大致设计思路
获取当前批量设置中,所有的配置项信息
为每个配置项设计一个处理器(高阶函数):主要处理【批量设置的配置信息】和【当前单元格的配置信息】合并或替换逻辑
通过管道的方式,加工每个单元格所有的配置项信息
核心实现
•pipe函数
private pipe = (...args: any) => { return (result: any, config?: any) => { return args.reduce((acc: any, fn: any) => fn(acc, config), result); };};•高阶函数处理每个配置项
// 扩展方向替换private handleExpand(expandConf: string) { return (conf: any) => { if (expandConf) { conf.expandDirection = expandConf; } return conf; };}// 父行/父列替换private handleParentCell(columnParentCell: any, rowParentCell: any) { return (conf: any) => { if (columnParentCell?.parentSelectType) { conf.columnParentCell = columnParentCell; } if (rowParentCell?.parentSelectType) { conf.rowParentCell = rowParentCell; } return conf; };}// 条件属性追加private handleCondition(conditionBatchConf: any) { return (conf: any) => { conf.conditionConf = this.mergeCondition(conf?.conditionConf || [], conditionBatchConf); return conf; };}// 批量修改private mergeCondition(c1: any, c2: any) { for (let j = 0; j < c1.length; j++) { // 批量删除 if ( c1[j]?.batchFlag && this.batchConf.conditionConf?.find((item: any) => item.uuid === c1[j]?.uuid) && !c2.find((item: any) => item.uuid === c1[j]?.uuid) ) { c1.splice(j, 1); } } for (let j = 0; j < c1.length; j++) { for (let i = 0; i < c2.length; i++) { // 如果字段已存在则替换 if (c2[i]?.uuid === c1[j]?.uuid) { c1.splice(j, 1); } } } return [...c1, ...c2];}//...•组合函数,获取每个单元格的最终配置信息
//...let handles: Array = [];if (cell?.dataConf?.cellType === "文本") { handles = [ this.handleExpand(conf.expandDirection), this.handleParentCell(conf.columnParentCell, conf.rowParentCell) ];} else if (cell?.dataConf?.cellType === "字段" || cell?.dataConf?.cellType === "公式") { handles = [ this.handleExpand(conf.expandDirection), this.handleParentCell(conf.columnParentCell, conf.rowParentCell), this.handleFormat(conf.dataFormatConf), this.handleFilter(conf.cellFilterConf), this.handleCondition(conf.conditionConf) ];}if (handles.length > 0) { const mergeConf = this.pipe(...handles)(JSON.parse(JSON.stringify(cell.dataConf))); //...}四、总结
函数式编程可以可提高代码的可重用性,减少重复代码的开发时间;
函数式编程可以提高代码的可读性,使得代码更容易理解和调试;
函数式编程可以更容易实现函数组合,以帮助提高可维护性;
组合优于继承;
审核编辑:汤梓红标签:
您可能也感兴趣:
为您推荐
每日热讯!科创50ETF期权在上交所正式上市交易
当前通讯!农业银行完成发行200亿元“三农”专项金融债
三大人民币汇率指数全线下跌 CFETS指数跌0.32% 天天热头条
排行
精彩推送
- 前端开发之函数式编程实践
- 世界热消息:中物联:5月份中国大宗商品指数为100.7% 环比回升0.4%
- 午评:两市分化创指跌近1.5% 市场猜测引发“宁王”大跌_环球热头条
- 朔州市今年有26302名考生报名参加高考 焦点快看
- 如意集团是哪一年成立的?如意集团最新股票行情介绍
- 博雅生物是一家什么公司?博雅生物获得过哪些荣誉?
- 引进新品种增产又增收|环球热讯
- 核酸小屋变身微型消防驿站_观焦点
- 最新:柳林县以项目建设为县域经济发展夯基赋能
- 世界微资讯!临汾:临汾夏收第一镰在侯马南张里村开镰
- 当前焦点!昆仑万维CEO方汉:AIGC将是下一个对标互联网的超级机遇
- 世界头条:“长风一号”靶标飞行试验圆满成功
- 贵研铂业源于哪个单位?贵研铂业获得过哪些企业荣誉?
- 中顺洁柔是一家什么企业?中顺洁柔获得过哪些荣誉?
- 每日热讯!科创50ETF期权在上交所正式上市交易
- 德赛电池配股募不超25亿元获深交所通过 中信证券建功 今日观点
- 每日播报!自己签下的合同,含泪也要踢完!皇马想要凯恩 列维...
- 新锐动效设计师陈烨:闯进国际电影节的运城人-环球微动态
- 环球观热点:轩岗煤电公司焦家寨矿:不断创新宣教方式提升安...
- 华新燃气集团柳林煤成(层)气区块管网连接线开工建设
- 当前信息:方山县:多彩活动进乡村移风易俗倡新风
- 当前通讯!农业银行完成发行200亿元“三农”专项金融债
- 【原】每个人有每个人的功课,每个人有每个人的因果。不要卷...
- 浑源县恒山山火已扑灭犯罪嫌疑人被控制
- 今日观点!盛弘股份终止发行不超4亿可转债 保荐机构为民生证券
- 科创50ETF期权今天上市交易
- 新资讯:央行上海总部:配合落实好差别化住房信贷政策
- 三大人民币汇率指数全线下跌 CFETS指数跌0.32% 天天热头条
- 为党育人、为国育才!吉林大学原创话剧《先生向北》长春上演
- 环球观热点:推项目促融资 地方多举措激发民间投资信心活力
- 当前时讯:债市观察:增量政策担忧升温 机构仍看好做多短端...
- 世界视讯!阳高县友宰镇:村民吃上了放心水
- 万荣县多模式促高校毕业生就业
- 华嵘控股跨界重组“屡败屡战” 最新方案为拟收购开拓光电100%股权
- 增强对A股市场的信心、决心和耐心
- 娄烦县兑集沟村:山药蛋变成金蛋蛋
- 南京钢联百亿元并购案陷入缠斗 南钢集团作为有独立请求权第...
- 528家科创板公司IPO募资逾8200亿元 长三角撑起“半壁江山”|环球资讯
- 全球新消息丨【做强专业镇打造新动能】数智赋能法兰专业镇建...
- 天天资讯:抢收小麦
- 焦点报道:安平金德隆网业有限公司
- 【国际大宗商品早报】数据好于预期金价跌超1% 国际油价显著...
- 装修中的甲醛主要来自哪些地方_常见的装修污染有哪些
- 有关情人节的歌曲大全(有关情人节的歌曲) 全球微资讯
- 最新资讯:全脂奶和脱脂奶的区别-脱脂奶精
- 黑白线条长靴搭配黑色褶皱打底裤,冬天的穿搭,时髦单品 环...
- 正泰电器拟分拆子公司主板上市 正泰安能系国内最大户用光伏...
- 世界观热点:动画微视频《我在》
- 环球最新:主播说联播 | 中国航天:可靠、稳定、成熟
- 冰玉化水的原因-冰玉
- 顶级跑车排行榜最新_顶级跑车排行榜 天天百事通
- 我国将进一步丰富拓展5G应用场景 全球快看
- 北京宣武区可提供新飞冰箱维修服务地址在哪 当前热门
- 增幅计算公式大全_增幅计算公式
- 全球新消息丨爱国流行歌曲适合女生的 爱国流行歌曲
- 中国星辰 | 神十五“像流星一样回到祖国怀抱”
- 甘肃白银可提供欧科微波炉维修服务地址在哪
- 河南:与天争时 全力抢收夏粮 全球视点
- 拓展新产业 激活新引擎——来自工业绿色发展一线的观察 报道
- 静电中和器主要用来消除导电上的静电_静电中和器 世界快报
- 惠誉:美国信用评级仍将处于负面观察状态_热文
- 全球报道:【见·闻】中巴企业家相遇圣保罗州西北部探索合作机遇
- 国内外因素叠加带来股市大涨,市场情绪明显修复,看好AI、计...
- 最低5.5折,“高铁月票”来了!杭州去这些地方下周起可买|世...
- 最新快讯!应对需求压力 激发内生动力——当前工业经济走势观察
- 邮你贷的逾期影响-环球热头条
- 全球热点!死神诀别谭:虚圈画面,马尾织姬真好看,葛力姆乔...
- 世界观焦点:省民政厅联合十部门印发方案 2025年底特殊困难...
- 吕梁启动“一泓清水入黄河”工程
- 热推荐:【GPT机翻】战国小町苦劳谭 (戦国小町苦労譚)- 短...
- 全球视讯!【多措并举确保粮食安全】农大专家为平陆农业生产...
- 广西柳江:空调企业产研联动迎旺季
- 【全球速看料】男士穿女士裤袜吗_男士穿女士裤袜
- 大山少年的体育梦
- 九龙虫怎么吃治什么病_九龙虫怎么吃|全球播资讯
- 司鼓图片(司鼓) 全球快播
- 三证一照分别是指哪些_三证一照_全球快播
- 打卡中国·读懂中国式现代化|辽宁大连:海湾名城 振兴潮涌
- 江东新区5周年,这些企业疯狂拿地约409万平方米,具体位置都...
- 人过七十才发现,许久不联系的人,突然联系你,逃不过这两个原因
- 环球动态:大奎强!穆谢奎卧射扩大比分!姚均晟传射建功
- 每日观察!上交所最新通知:首批上市,下周一见!
- 聚焦:每日技巧分享:怎么合成立体声?
- 世界新资讯:为什么古代少数民族都是幼子继承制?而汉族却是...
- 京津冀签署协议推进交通基础设施互联互通
- 美腕战略副总裁严正离职,曾参与起草直播行业多项标准 焦点信息
- 美债违约风波终于平息! 拜登大肆吹捧“新功绩”:“美国避免...
- 暨是什么意思 145154d2b什么意思
- 硅动力上会前夕撤回IPO申请 保荐机构为安信证券|世界独家
- 泰丰智能过会:今年IPO过关第134家 一创投行过3单
- 西南交大教务网登录入口_西南交大教务网
- 事涉1470亿美元,印度戏耍俄罗斯,收到卢比没用?莫迪有个主意
- 环球看点!sem是什么?_sem seo是什么意思
- 【财经分析】投资者乐观情绪推动 纽约股市三大股指2日显著上涨
- 华泰证券举办数字金融科技论坛:科技驱动强化金融服务创造力_...
- 【环球新视野】肠炎宁的功效与作用有什么副作用_肠炎宁的功效...
- 天天即时:风湿性关节炎的临床表现及护理措施_风湿性关节炎的...
- 【环球财经】芝加哥农产品期价2日全线上涨
- 华住酒店集团美股涨7.84%|全球速讯
- 优品车美股涨18.71%