科里化函数和函数管道

科里化函数

将函数一些不会变的参数固定下来,方便统一处理。在函数式编程中,科里化函数最重要的作用就是将多参函数变成单参函数。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值