Javascript-针对单个参数执行函数数组
我有一个类有两个函数。Add,它将函数添加到数组中,Execute,它根据其参数执行函数数组。我的代码是:Javascript-针对单个参数执行函数数组,javascript,arrays,Javascript,Arrays,我有一个类有两个函数。Add,它将函数添加到数组中,Execute,它根据其参数执行函数数组。我的代码是: class LazyEvaluation { constructor(){ this.functionQueue = [] } add(fn){ this.functionQueue.push(fn) return this } evaluate(target){ for (let i = 0; i < this.functio
class LazyEvaluation {
constructor(){
this.functionQueue = []
}
add(fn){
this.functionQueue.push(fn)
return this
}
evaluate(target){
for (let i = 0; i < this.functionQueue.length; i++){
let newArray = target.map(this.functionQueue[i])
return newArray
}
}
}
并给出了执行函数[1,2,3]
我需要的输出是[3,5,7]
,但是我得到了[2,4,6]
和[2,3,4]
如何确保execute函数不会为functionQueue中的每个函数创建新数组?您在
for
循环中返回得太早了。实际上,您必须减少传递目标值的函数:
class懒散评估{
构造函数(){
this.functionQueue=[]
}
添加(fn){
this.functionQueue.push(fn)
还这个
}
评估(目标){
返回target.map(x=>
this.functionQueue.reduce((y,f)=>f(y),x)
);
}
}
const sums=新懒散评估();
加法(x=>x*2);
相加(x=>x+1);
console.log(
求和。求和([1,2,3])
);代码>
例如,当functionQueue数组具有以下两个函数时:
(function timesTwo(a){ return a * 2 })
(function addOne(a) { return a + 1 })
(function timesTwo(a){ return a * 2 })
(function addOne(a) { return a + 1 })
而execute
函数被赋予[1,2,3]
我需要的输出是[3,5,7]
,但是我得到了[2,4,6]
和[2,3,4]
您需要将第一个函数的结果输入第二个函数,以此类推:
evaluate(target){
return target.map(value => {
for (const f of this.functionQueue) {
value = f(value);
}
return value;
});
}
实例:
class懒散评估{
构造函数(){
this.functionQueue=[]
}
添加(fn){
this.functionQueue.push(fn)
还这个
}
评估(目标){
返回target.map(值=>{
for(此.functionQueue的常数f){
值=f(值);
}
返回值;
});
}
}
const l=新懒散评估();
l、 添加(函数times2(a){返回a*2});
l、 add(函数addOne(a){返回a+1});
日志(l.evaluate([1,2,3])代码>这不会产生所需的输出。@t.J.Crowder啊,读得太快了一点,跳到了我在代码中看到的第一个“错误”上。现在修好了!谢谢你的提醒,这仍然不是OP想要的输出。因为我选择了不同的示例数据。。。这不是关于复制精确的示例结果,而是关于找出逻辑,对吗?我希望OP阅读我的代码片段并查看它是否满足要求,而不仅仅是检查console.log的结果。你同意这是一个有效的方法吗?谢谢,这很有效只是为了理解,有没有可能解释一下为什么会这样?因此,目标映射的结果被传递到reduce?this.functionQueue的const f是否有效const
不应该是一个永远不会被赋值的变量?@Michael-是的,它是有效的-您注意到可运行的示例了吗?:-)循环中声明的const
和let
“变量”的语义不同于循环中var
变量的行为:为每个循环迭代创建不同的变量/常量<对于
的
和
中的
的不要试图修改该变量的值,因此可以使用常量for
会修改它,所以在这种情况下你必须使用let
(尽管每次都是不同的变量)。@Michael-新行为在解决常见问题方面非常有用。我注意到了runnable示例,甚至可以在我的chrome控制台中运行它以确保:)我知道让f离开这个。functionQueue
但是const j…。
对我来说听起来不合逻辑。@Michael-:-)如果你深入研究,这是合乎逻辑的,每次都是一个不同的变量/常量for of
是一种语法糖,用于获取迭代器,调用其next
方法以获取结果对象,然后将变量/常量分配给结果的值
属性;然后重复下一次
调用下一次。这里有一个冗长的例子: