• 函数柯里化


    函数柯里化

    在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。而对于JavaScript语言来说,我们通常说的柯里化函数的概念,与数学和计算机中的柯里化的概念并不完全一样。

    对于已经柯里化后的函数来说,当接收的参数数量原函数的形参数量相同时,执行原函数;当接收的参数数量小于原函数的形参数量时,返回一个函数用于接收剩余的参数,直至接收的参数数量与形参数量一致,执行原函数。

    柯里化的定义:接收一部分参数,返回一个函数接收剩余参数,接受足够参数后,执行原函数。

    普通版

    function curry(fn,len = fn.length,...args) {
        return function(...params){
            let _args = [...args,...params]
            if(_args.length >= len){
                return fn.apply(this,_args);
            }else{
                return curry.call(this,fn,len,..._args)
            }
        }
    }
    

    占位符版

    function _curry(fn,length,holder,args = [],holders = []){
        return function(..._args){
            //将参数复制一份,避免多次操作同一函数导致参数混乱
            let params = args.slice();
            //将占位符位置列表复制一份,新增加的占位符增加至此
            let _holders = holders.slice();
            //循环入参,追加参数 或 替换占位符
            _args.forEach((arg,i)=>{
                //真实参数 之前存在占位符 将占位符替换为真实参数
                if (arg !== holder && holders.length) {
                    let index = holders.shift();
                    _holders.splice(_holders.indexOf(index),1);
                    params[index] = arg;
                }
                //真实参数 之前不存在占位符 将参数追加到参数列表中
                else if(arg !== holder && !holders.length){
                    params.push(arg);
                }
                //传入的是占位符,之前不存在占位符 记录占位符的位置
                else if(arg === holder && !holders.length){
                    params.push(arg);
                    _holders.push(params.length - 1);
                }
                //传入的是占位符,之前存在占位符 删除原占位符位置
                else if(arg === holder && holders.length){
                    holders.shift();
                }
            });
            // params 中前 length 条记录中不包含占位符,执行函数
            if(params.length >= length && params.slice(0,length).every(i=>i!==holder)){
                return fn.apply(this,params);
            }else{
                return _curry.call(this,fn,length,holder,params,_holders)
            }
        }
    }
    

      

  • 相关阅读:
    算法学习记录单链表
    算法学习记录排序
    算法学习记录图——最小生成树之prim算法
    算法学习记录图——应用之拓扑排序(Topological Sort)
    算法学习记录图(DFS BFS)
    算法学习记录排序——冒泡排序(Bubble Sort)
    算法学习记录图——最小路径之Floyd算法
    自用SqlHelper.cs
    WPF的DataGrid的标题加粗样式
    .NET Framework 4.0不能用sqlite的问题解决方法
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/13027610.html
Copyright © 2020-2023  润新知