我有一个有两个功能的课程。 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中的每个函数创建新数组?
答案 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;
});
}
直播示例:
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;