科里化函数
将函数一些不会变的参数固定下来,方便统一处理。在函数式编程中,科里化函数最重要的作用就是将多参函数变成单参函数。
function curry(func,...args){
return function(...subArgs){
const totalArgs = [...args,...subArgs];
if(totalArgs >= func.length){
//参数够了
return func(...totalArgs);
} else {
//参数不够 继续固定 递归返回函数 再次进行参数够不够判断
return curry(func,...totalArgs);
}
}
}
function curry() {
const fn = arguments[0]; // 拿到要执行的函数
const args = Array.prototype.slice.call(arguments, 1); // 拿到传入的参数
if(args.length === fn.length) { // 第一次参数满了
return fn.apply(this, args);
}
// 参数没有满,就要返回一个函数
function _curry() {
// 将外面调用的函数的参数,加入到之前的参数中
args.push(...arguments);
if(args.length === fn.length) {
return fn.apply(this, args);
}
// 还没满,返回函数
return _curry;
}
return _curry;
}
function getNumber(a, b, c, d) {
return (a + b + c) * d;
}
//(2+3+4)*10 (2+5+6)*1 (2+5+3)*1 (2+5+4)*5
const cur1 = curry(getNumber, 2);
console.log(cur1(3, 4, 10)); // 90
console.log(cur1(5, 6, 1)); // 13
const cur2 = cur1(5);
console.log(cur2(3,1)); // 10
console.log(cur2(4,5)); // 55
function add() {
const args = Array.prototype.slice.call(arguments);
function _add() {
args.push(...arguments);
return _add;
}
_add.getRes = function () {
return args.reduce((a, b) => a + b);
}
return _add;
}
//console.log(add(1)(2)(3).getRes());
// console.log(add(1,3,2)(2)(3).getRes());
函数管道
函数管道就是将多个单参函数结合起来,形成一个新的函数。
前一个函数的输出,是后一个函数的输入。和Linux的管道有点类似。
/**
* 函数管道
* @param {...any} args
*/
function pipe(...args) {
return function (val) {
// return args.reduce((result,func)=>{
// return func(result);
// },val)
for (let i = 0; i < args.length; i++) {
// val = args[i](val);
const func = args[i];
val = func(val);
}
return val;
}
}
- 应用
/**
* 将单词的首字母大写
* @param {*} str
*/
function everyFirstLetters2up(str) {
return str.replace(/\b(\w)(\w*)\b/g, function ($, $1, $2) {
return $1.toUpperCase() + $2;
});
}
/**
* 将第一个单词的首字母小写
* @param {*} str
*/
function firstLetters2up(str) {
return str.replace(/\w/, function ($) {
return $.toLowerCase();
});
}
/**
* 将除第一个字母的单词变为小写
* @param {*} str
*/
function toLowerCase(str) {
return str.replace(/\b(\w)(\w*)\b/g, function ($, $1, $2) {
return $1 + $2.toLowerCase();
});
}
/**
* 去掉空格
* @param {*} str
*/
function remove(str) {
return str.replace(/\s/g, '');
}
/**
* 截取固定length长度的str
* @param {*} length
* @param {*} str
*/
function sliceStr(length, str) {
return str.substr(0, length);
}
const camelNanme = pipe(everyFirstLetters2up,
firstLetters2up, toLowerCase, remove, curry(sliceStr, 6));
console.log(camelNanme('MY TEst '));
console.log(camelNanme('MY wTEst sdfsdT sdfs '));
//myTest
//myWtes