使用reduceRight()-JavaScript组合具有多个参数的函数

使用reduceRight()-JavaScript组合具有多个参数的函数,javascript,Javascript,我正在尝试使用reduceRight实现具有多个参数的函数组合。这个问题已在此时得到回答,但输入数据略有不同。出于某种原因,我得到了以下错误:uncaughttypeerror:fn不是函数。避免使用func3=([x,y])=>(y>0?x+3:x-3)以这种格式。如果有办法,请告诉我 const compose = (...fns) => (...args) => fns.reduceRight((acc, fn) => fn(acc), args);

我正在尝试使用reduceRight实现具有多个参数的函数组合。这个问题已在此时得到回答,但输入数据略有不同。出于某种原因,我得到了以下错误:
uncaughttypeerror:fn不是函数
。避免使用
func3=([x,y])=>(y>0?x+3:x-3)以这种格式。如果有办法,请告诉我

 const compose = (...fns) => (...args) =>
      fns.reduceRight((acc, fn) => fn(acc), args);

    const func3 = (x, y) => (y > 0 ? x + 3 : x - 3);
  //const func3 = ([x, y]) => (y > 0 ? x + 3 : x - 3); - avoid using this version

    const func2 = x => x ** 2;

    const func1 = x => x - 8;

    const fnOne = compose([func1, func2, func3])('3', 1);
    console.log(fnOne); // should be 1081

    const fnTwo = compose([func1, func2, func3])('3', -1);
    console.log(fnTwo); //should be -8


  [1]: https://stackoverflow.com/questions/55842990/multiple-arguments-composible-function-implementation-using-reduceright
解决方案

Array#reduceRight只支持一个currentValue,因此我们不能让一个函数接受多个参数。唯一的方法是避免在第一次调用时使用reduceRight,方法是从数组中弹出它并调用它manual,而不是让reduceRight这样做:

第一种方法

第二种方法


将数组而不是函数(或多个函数)传递到compose中,因此
fn
是一个数组,当您尝试将其用作函数时会出现该错误

…fns
替换为
fns
(以便compose需要一个数组),或者删除要编写的调用中的方括号。还应使用已注释掉的func3版本:

const compose=(…fns)=>(…args)=>
fns.reduceRight((acc,fn)=>fn(acc,args);
常数func3=([x,y])=>(y>0?x+3:x-3);
常数func2=x=>x**2;
常数func1=x=>x-8;
常数fnOne=合成(func1,func2,func3)('3',1);
console.log(fnOne);//应该是1081
常数fnTwo=组合(func1,func2,func3)('3',-1);

console.log(两个)//应该是-8
您将数组传递到compose而不是函数(或多个函数),因此
fn
是一个数组,当您尝试将其用作函数时会出现该错误

…fns
替换为
fns
(以便compose需要一个数组),或者删除要编写的调用中的方括号。还应使用已注释掉的func3版本:

const compose=(…fns)=>(…args)=>
fns.reduceRight((acc,fn)=>fn(acc,args);
常数func3=([x,y])=>(y>0?x+3:x-3);
常数func2=x=>x**2;
常数func1=x=>x-8;
常数fnOne=合成(func1,func2,func3)('3',1);
console.log(fnOne);//应该是1081
常数fnTwo=组合(func1,func2,func3)('3',-1);
console.log(两个)//应为-8
  • 您需要提供三个参数/函数来组成函数,而不是数组
  • func3将是执行的第一个函数,因此它将接收数组参数。此数组需要在x和y变量中。可以在参数定义中进行此缩减,如下所示:([x,y])
  • const compose=(…fns)=>(…args)=>
    fns.reduceRight((acc,fn)=>fn(acc,args);
    常数func3=([x,y])=>y>0?x+3:x-3;
    常数func2=x=>x**2;
    常数func1=x=>x-8;
    常数fnOne=合成(func1,func2,func3)('3',1);
    console.log(fnOne);//应该是1081
    常数fnTwo=组合(func1,func2,func3)('3',-1);
    console.log(两个)//应为-8
  • 您需要提供三个参数/函数来组成函数,而不是数组
  • func3将是执行的第一个函数,因此它将接收数组参数。此数组需要在x和y变量中。可以在参数定义中进行此缩减,如下所示:([x,y])
  • const compose=(…fns)=>(…args)=>
    fns.reduceRight((acc,fn)=>fn(acc,args);
    常数func3=([x,y])=>y>0?x+3:x-3;
    常数func2=x=>x**2;
    常数func1=x=>x-8;
    常数fnOne=合成(func1,func2,func3)('3',1);
    console.log(fnOne);//应该是1081
    常数fnTwo=组合(func1,func2,func3)('3',-1);
    
    console.log(两个)//如果您不能或希望将
    func3
    转换为单参数函数,则应为-8。您可以在调用
    fn
    时分散
    args
    。然后将结果捕获到一个数组中,以便在下一次
    fn
    调用中传播。返回最终结果时,只需获取结果数组的第一个元素

    const compose=(…fns)=>(…args)=>
    fns.reduceRight((args,fn)=>[fn(…args)],args[0];
    常数func3=(x,y)=>(y>0?x+3:x-3);
    //常数func3=([x,y])=>(y>0?x+3:x-3);-避免使用此版本
    常数func2=x=>x**2;
    常数func1=x=>x-8;
    常数fnOne=合成(func1,func2,func3)('3',1);
    console.log(fnOne);//应该是1081
    常数fnTwo=组合(func1,func2,func3)('3',-1);
    
    console.log(两个)//如果您不能或希望将
    func3
    转换为单参数函数,则应为-8。您可以在调用
    fn
    时分散
    args
    。然后将结果捕获到一个数组中,以便在下一次
    fn
    调用中传播。返回最终结果时,只需获取结果数组的第一个元素

    const compose=(…fns)=>(…args)=>
    fns.reduceRight((args,fn)=>[fn(…args)],args[0];
    常数func3=(x,y)=>(y>0?x+3:x-3);
    //常数func3=([x,y])=>(y>0?x+3:x-3);-避免使用此版本
    常数func2=x=>x**2;
    常数func1=x=>x-8;
    常数fnOne=合成(func1,func2,func3)('3',1);
    console.log(fnOne);//应该是1081
    常数fnTwo=组合(func1,func2,func3)('3',-1);
    
    console.log(两个)//应该是-8
    我想避免使用这个版本
    constfunc3=([x,y])=>(y>0?x+3:x-3)
    @JohnJohn Array#reduceRight只支持一个
    currentValue
    ,因此不能让函数接受那样的多个参数。唯一的方法是避免在第一次调用时使用reduceRight,方法是从数组中弹出它并调用它,而不是让reduceRight来执行:
    const compose=(…fns)=>(…args)=>fns.reduceRight((acc,fn)=>fn(acc),fns.pop()(…args))我明白了。谢谢你的解释@约翰约翰诺problem@Paul您可以使用
    redu
    
    const compose = fns => (...args) =>
          fns.reduceRight((acc, fn) => fn(acc), fns.pop()(...args));
    
    const compose = fns => (...args) =>
          fns.reduceRight((acc, fn) => fn(...[acc, ...args.slice(1)]), args[0]);