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

时间:2018-06-06 09:25:13

标签: 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.functionQueue.length; i++){
      let newArray = target.map(this.functionQueue[i])
      return newArray
    }
  }
}

就目前而言,当我在数组中只有一个函数时,此代码可以正常工作。我的问题是,只要数组中有多个函数,执行函数就为每个函数创建一个新数组。

例如,当functionQueue数组具有以下两个函数时:

(function timesTwo(a){ return a * 2 })
(function addOne(a) { return a + 1 })

执行函数给出[1, 2, 3]

我需要的输出是[3, 5, 7]但是我得到[2, 4, 6][2, 3, 4]的两个单独输出

如何确保执行函数不为functionQueue中的每个函数创建新数组?

2 个答案:

答案 0 :(得分:2)

你在for循环中过早返回。您实际上必须reduce传递来自target

的值的函数

class LazyEvaluation {
  constructor(){
    this.functionQueue = []
  }

  add(fn){
    this.functionQueue.push(fn)
    return this
  }

  evaluate(target){
    return target.map(x => 
      this.functionQueue.reduce((y, f) => f(y), x)
    );
  }
}

const sums = new LazyEvaluation();
sums.add(x => x * 2);
sums.add(x => x + 1);

console.log(
  sums.evaluate([1,2,3])
);

答案 1 :(得分:1)

  

例如,当functionQueue数组具有以下两个函数时:

(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;
  });
}

直播示例:

&#13;
&#13;
class LazyEvaluation {
  constructor(){
    this.functionQueue = []
  }

  add(fn){
    this.functionQueue.push(fn)
    return this
  }

  evaluate(target){
    return target.map(value => {
        for (const f of this.functionQueue) {
            value = f(value);
        }
        return value;
    });
  }
}

const l = new LazyEvaluation();
l.add(function timesTwo(a){ return a * 2 });
l.add(function addOne(a) { return a + 1 });
console.log(l.evaluate([1, 2, 3]));
&#13;
&#13;
&#13;