如何消除本地变量实现 Lodash 函数的完全 Point-Free 写法
实现完全Point-Free写法的方案
你可以借助 Lodash/fp 内置的 _.converge 组合子消除临时变量 idx,它的作用是将多个分支函数的计算结果作为参数传入主函数,刚好适配你需要同时传入「要丢弃的段数」和「原始段数组」给 _.drop 的场景。
改写后的完整可运行代码如下:
const _ = require('lodash/fp'); const urls = [ 'http://localhost:8080/petstore/v1', '//localhost/petstore/v1', '{server}/batch-service/api/batches/lwm2m/v1', 'https://{server}/batch-service/api/batches/lwm2m/v1', '/batch-service/api/batches/lwm2m/v1', '/', ] const containAny = patterns => str => _.some(pattern => _.includes(pattern, str), patterns); const convert = _.flow([ _.split('/'), _.converge(_.drop, [ // 分支1:计算需要丢弃的段数 = 最后一个匹配段的索引 + 1 _.flow(_.findLastIndex(containAny(['{', '}', ':'])), _.add(1)), // 分支2:直接返回原始段数组作为drop的第二个入参 _.identity ]), _.reject(_.isEmpty), _.join('/'), // 用柯里化方法替代路径拼接匿名函数 _.add('/') ]); _.map(convert)(urls);
逻辑说明
_.converge接收的两个分支函数都会接收同一个输入(split 后的路径段数组),计算完成后分别作为第一个、第二个参数传入主函数_.drop,逻辑和原有实现完全等价,不需要额外引入ap方法实现- 末尾的路径拼接逻辑直接用柯里化的
_.add('/')替代,利用 Lodash/fp 函数默认柯里化、参数置后的特性,满足给传入路径前拼接/的需求
内容的提问来源于stack exchange,提问作者aleung
相关产品推荐
相关产品推荐

