柯理化案例
const _ = require("loadsh");// "".match(/\s+/g) 正则表达式 匹配字符串中的所有空格// "".match(/\d+/g) 这则表达式 匹配字符串中的所有数字// 封装一个匹配方法const matchNum = (reg, str) => str.match(reg);// 上面的方法 如果同一个正则使用多次,可以改造一下const curriedMatchNum = (reg) => { return (str) => str.match(reg);};const match1 = curriedMatchNum(/\d+/g);console.log(match1("xaskjl1d1"));console.log(match1("4 22"));// 使用curryconst curryMatch = _.curry(function (reg, str) { return str.match(reg);});console.log(curryMatch(/\d+/g, "xaskjl1d1"));console.log(curryMatch(/\d+/g)("xaskjl1d1"));// 通过 curryMatch 函数来生成新的函数 判断字符串中是否含有数字const hasNumFn = (str) => { return curryMatch(/\d+/g)(str);};console.log("hasNumFn", hasNumFn("xxx"));console.log("hasNumFn", hasNumFn("xx2x2"));// 过滤一个数组中的所有含有数字的成员项const arr = ["2", "xxx", "22", 22, "ad", "5", 8, "xx1"];const filterNumFn = (array) => { const result = []; for (let val of array) { if (hasNumFn(`${val}`)) { result.push(val); } } return result;};console.log("filterNumFn", filterNumFn(arr));// 使用数组的filter方法,来过滤数组的数字成员项。并封装成一个柯理化函数const filterFn = _.curry(function (reg, array) { return array.filter((item) => `${item}`.match(reg));});console.log("filterFn", filterFn(/\d+/g)(arr));// 继续抽离const filterFn2 = _.curry(function (fn, array) { return array.filter(fn);});const filterNumber = filterFn2(function (item) { return `${item}`.match(/\d+/g);});console.log("filterNumber", filterNumber(arr));const filterNumber2 = filterFn2((item) => hasNumFn(`${item}`));console.log("filterNumber2", filterNumber2(arr));const filterNumber3 = filterFn2((item) => `${item}`.match(/\d+/g));console.log("filterNumber3", filterNumber3(arr));// 使用纯函数 柯理化的目的是为了更好的复用共用代码const matchSpace = (str) => `${str}`.match(/\s+/g);const hasSpaceCurry = _.curry((fn, arr) => arr.filter(fn));const hasSpace = hasSpaceCurry(matchSpace);console.log("hasSpace" , hasSpace(['x xx','2d d','222','x1']))console.log("hasSpace", hasSpace(["gg", "xd", "1 3", "11"]));// [ '1', '1' ]// [ '4', '22' ]// [ '1', '1' ]// [ '1', '1' ]// hasNumFn false// hasNumFn true// filterNumFn [ '2', '22', 22, '5', 8, 'xx1' ]// filterFn [ '2', '22', 22, '5', 8, 'xx1' ]// filterNumber [ '2', '22', 22, '5', 8, 'xx1' ]// filterNumber2 [ '2', '22', 22, '5', 8, 'xx1' ]// filterNumber3 [ '2', '22', 22, '5', 8, 'xx1' ]// hasSpace [("x xx", "2d d")];// hasSpace ["1 3"];