Javascript-针对单个参数执行函数数组

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

我有一个类有两个函数。Add,它将函数添加到数组中,Execute,它根据其参数执行函数数组。我的代码是:

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
方法以获取结果对象,然后将变量/常量分配给结果的
属性;然后重复
下一次
调用下一次。这里有一个冗长的例子: