gpt4 book ai didi

javascript - 根据输入参数在 JavaScript 中动态生成一个函数

转载 作者:行者123 更新时间:2023-11-30 19:33:21 29 4
gpt4 key购买 nike

我有一个成本函数,它应该根据用户和对象的参数输出成本。作为一个简单但不切实际的例子,让我们考虑:

// example of input user
let user1 = {
access: [true, false],
utility: [2, 5]
};
// example of input object
let object1 = {type: 0, cost: 15};

// static vertions of the cost function
const costFunction = (user, object) => {
switch (object.type){
case 0:
if(user.access[0]){
return object.cost * user.utility[0];
}else{
return Infinity;
};
case 1:
if(user.access[1]){
return object.cost * user.utility[1];
}else{
return Infinity;
};
};
};

costFunction(user1, object1) // sould return 2*15 = 30

但是,在算法中,我必须针对同一用户但针对不同的对象多次调用此函数。所以,我希望能够只处理一次用户的参数,并动态生成一个用户适应的成本函数,如下所示:

// dynamically generated a user-adapted const function
const costFunctionGenerator = (user) => {
... some code ...
const costFunction = (object) => {
... some code ...
};
return costFunction;
};

const user1CostFunction = costFunctionGenerator(user1)

这样,user1CostFunction 将等于

const user1CostFunction  = (object) => {
switch (object.type){
case 0:
return object.cost * 2;
case 1:
return Infinity;
}
}

发生的事情是我们删除了来自用户参数 user1.accessif 条件,并且我们还转换了来自 user1.utility 指向 user1CostFunction 中的 float 元素。

我的问题是我不知道如何实现函数 costFunctionGenerator

最佳答案

您正在寻找的模式名称称为柯里化(Currying)函数。

在 es6 之前的 Javascript 中,创建柯里化(Currying)函数有点笨拙,但随着箭头函数语法的到来,语法变得更好了。基本上,您唯一需要做的就是将您的签名更改为:

const costFunctionCurried = (user) => (object) => {
switch (object.type){
case 0:
if(user.access[0]){
return object.cost * user.utility[0];
}else{
return Infinity;
};
case 1:
if(user.access[1]){
return object.cost * user.utility[1];
}else{
return Infinity;
};
};
};

但是它是如何工作的呢?当您第一次调用 costFunctionCurried 时,它会修复所有调用变量 user 并返回新的 lambda 的地方,它只需要传递对象:

costFunctionCurried(user1)(object1) //you can call it inline

//or you can assign your function to a variable for reuse
const fixedUserCostFunction = costFunctionCurried(user1)

fixedUserCostFunction(object1)
fixedUserCostFunction(object2) //etc.

我创建了一个 benchmark测试柯里化(Currying)版本是否提供任何性能优势,并且确实执行得更快。

关于javascript - 根据输入参数在 JavaScript 中动态生成一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56212285/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com