一、Lodash中的柯里化方法
_.curry(func) 纯函数
- 功能:创建一个函数,该函数接收一个或多个func的参数,如果func所需要的参数都被提供,则执行func并返回执行的结果,否则继续返回该函数并等待接收剩余的参数。
- 参数:需要柯里化的函数
- 返回值:柯里化后的函数
const _ = require('lodash')
// 需要柯里化的函数
function sum (a, b, c) {
return a + b + c
}
// 柯里化后的函数
let curried = _.curry(sum)
console.log(curried(1, 2, 3)) // 6
console.log(curried(1, 2)(3)) // 6
console.log(curried(1)(2)(3)) // 6
// curry函数可以将任意多元函数转化为一元函数
二、柯里化案例
1、功能需求:提取字符串中的空白字符 | 数字
// ''.match(/\s+/g)
// ''.match(/\d+/g)
// 定义纯函数
function match (reg, str) {
return str.match(reg)
}
存在问题:当经常使用match纯函数提取指定字符,存在重复定义reg。
2、如何解决?
方案:采用函数柯里化解决问题
const _ = require('lodash')
// 为了避免声明变量,直接将纯函数匿名后传递给curry
const match = _.curry(function (reg, str) {
return str.match(reg)
})
// 通过函数柯里化生成了新函数
const haveSpace = match(/\s+/g)
const haveNumber = match(/\d+/g)
// 测试
console.log(haveSpace('hello world')) // [ ' ' ]
console.log(haveNumber('1234abc')) // [ '1234' ]
console.log(haveNumber('abc')) // null
3、功能需求:寻找数组中具有空白字符的元素
const _ = require('lodash')
// 为了避免声明变量,直接将纯函数匿名后传递给curry
const match = _.curry(function (reg, str) {
return str.match(reg)
})
// 通过函数柯里化生成了新函数
const haveSpace = match(/\s+/g)
const haveNumber = match(/\d+/g)
// 定义lodash函数柯里化的纯函数
const filter = _.curry(function (func, array) {
return array.filter(func)
})
// 给柯里化的纯函数传递2个参数
console.log(filter(haveSpace, ['John Connor', 'Tom'])) // [ 'John Connor' ]
console.log(filter(haveSpace, ['Hello World', 'Kate'])) // [ 'Hello World' ]
存在问题:每次调用都需要传递haveSpace,应该将它固化为一个特定需求的函数。
4、如何解决?
方案:给柯里化的纯函数filter只传递1个参数(简单理解为功能参数)并重新定义。
const _ = require('lodash')
// 为了避免声明变量,直接将纯函数匿名后传递给curry
const match = _.curry(function (reg, str) {
return str.match(reg)
})
// 通过函数柯里化生成了新函数
const haveSpace = match(/\s+/g)
const haveNumber = match(/\d+/g)
// 定义lodash函数柯里化的纯函数
const filter = _.curry(function (func, array) {
return array.filter(func)
})
const findSpace = filter(haveSpace)
console.log(findSpace(['John Connor', 'Tom'])) // [ 'John Connor' ]
console.log(findSpace(['Hello World', 'Kate'])) // [ 'Hello World' ]
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!