javascript映射函数的包装器
我有两个javascript函数stack(y,f)和val(yi,x) 堆栈(y,f)的行为如下javascript映射函数的包装器,javascript,dependency-injection,parameter-passing,eval,wrapper,Javascript,Dependency Injection,Parameter Passing,Eval,Wrapper,我有两个javascript函数stack(y,f)和val(yi,x) 堆栈(y,f)的行为如下 y.map(函数(yi){f}) 它返回一个数组r,其中每个元素r[i]是数组参数y[i]的对应元素的函数,表达式f作为第二个参数传递 f可以是任何计算为单个值的javascript代码,但是,如果它依赖于函数val,则该函数将依赖于y[i] [r[0],r[1],…]=堆栈([y[0],y[1],…]),foo(val(y[i],x1),val(y[i],x2),…) 我考虑了以下丑陋的方法,其
y.map(函数(yi){f})
它返回一个数组r,其中每个元素r[i]是数组参数y[i]的对应元素的函数,表达式f作为第二个参数传递
f可以是任何计算为单个值的javascript代码,但是,如果它依赖于函数val,则该函数将依赖于y[i]
[r[0],r[1],…]=堆栈([y[0],y[1],…]),foo(val(y[i],x1),val(y[i],x2),…)
我考虑了以下丑陋的方法,其中我将表达式作为字符串传递,并在循环中替换字符串,然后对其求值。
我想知道您是否可以看到任何更干净的解决方案,在理想情况下,我可以避免对字符串表达式求值。另一种选择是,如果val检测到stack是它的一个远程父级,那么它就已经返回了一个数组,但是获取调用stack和y似乎并不简单
任何更干净的解决方案,在理想情况下,我将避免对字符串表达式求值
简单,只需使用函数即可。您消除了非常容易出错的字符串,使代码更易于维护,并且更易于阅读和理解
字符串“foo(val(yi,3)、val(yi,4)、val(yi,5))”
可以转换为函数:
函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5));
}
当被调用而不是替换字符串yi
时,现在您只需传入它,所以
eval(f.replace(/yi/g,yi));
转化为简单的
f(yi);
以下是此转换的外观:
函数val(yi,x){
返回10**yi+x;
}
函数foo(x1,x2,x3){
返回x1+x2+x3;
}
函数堆栈(y,f){
返回y.map(函数(yi){
返回f(yi);
})
}
console.log([1,2].map(函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>> [42, 312]
log(堆栈([1,2],函数(yi)){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>>[42312]
任何更干净的解决方案,在理想情况下,我将避免对字符串表达式求值
简单,只需使用函数即可。您消除了非常容易出错的字符串,使代码更易于维护,并且更易于阅读和理解
字符串“foo(val(yi,3)、val(yi,4)、val(yi,5))”
可以转换为函数:
函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5));
}
当被调用而不是替换字符串yi
时,现在您只需传入它,所以
eval(f.replace(/yi/g,yi));
转化为简单的
f(yi);
以下是此转换的外观:
函数val(yi,x){
返回10**yi+x;
}
函数foo(x1,x2,x3){
返回x1+x2+x3;
}
函数堆栈(y,f){
返回y.map(函数(yi){
返回f(yi);
})
}
console.log([1,2].map(函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>> [42, 312]
log(堆栈([1,2],函数(yi)){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>>[42312]
我不明白为什么不传递一个函数<代码>“foo(val(yi,3),val(yi,4),val(yi,5))”->函数(yi){返回foo(val(yi,3),val(yi,4),val(yi,5))}
太棒了!非常感谢你!我不明白为什么不传递一个函数呢<代码>“foo(val(yi,3),val(yi,4),val(yi,5))”->函数(yi){返回foo(val(yi,3),val(yi,4),val(yi,5))}
太棒了!非常感谢你!
function val(yi,x) {
return 10**yi+x;
}
function foo(x1,x2,x3) {
return x1+x2+x3;
}
function stack(y,f) {
return y.map(function(yi) {
return eval(f.replace(/yi/g, yi));
});
}
console.log([1,2].map(function(yi) {
return foo(val(yi,3),val(yi,4),val(yi,5))
} ))
>> [42, 312]
console.log(stack([1,2], "foo(val(yi,3),val(yi,4),val(yi,5))"))
>> [42, 312]