在这种情况下如何减少工作量?

时间:2018-08-21 07:30:06

标签: javascript

我一直在研究管道函数,并且遇到了以_pipe函数为参数的reduce函数。 _pipe函数具有两个参数a,b,然后返回另一个函数。

如何减少此处的工作?

add3 = x => x + 3;
add5 = x => x + 5;
const _pipe = (a, b) => (arg) => b(a(arg))
const pipe = (...ops) => ops.reduce(_pipe)
const add = pipe(add3, add5)
add(10)

输出     18

2 个答案:

答案 0 :(得分:2)

查看管道函数定义:

const pipe = (...ops) => ops.reduce(_pipe)

它接收称为ops的函数数组(称为rest params)。 然后我们将reduce称为ops数组。减速器功能有2个参数:累加器和当前值。

这是我们的_pipe用易于理解的变量编写的:

const _pipe = (accumulator, currentValue) => (arg) => currentValue(accumulator(arg));

因此_pipe的结果将是来自ops数组的咖喱函数。

如果是[add3,add5],则结果将是(arg)=> add3(add5(arg))

如果是[add3,add5,add2],则结果为:(arg)=> add2(accumulator(arg)),其中accumulator为(arg)=> add3(add5(arg))。

您只需使用reduce即可从数组组成所有函数。然后传递初始值为10。

就像:add3(add5(10))= 18

答案 1 :(得分:0)

reduce功能等效于

add3 = x => x + 3;
add5 = x => x + 5;

const _pipe = (a, b) => (arg) => b(a(arg))

const pipe = (...ops) => {
  // create a base function
  let sum = x => x;
  
  // for every operation
  for (let op of ops) {
    // call _pipe with sum and it
    // equivalent to sum = x => sum(op(x))
    sum = _pipe(sum, op)
  }
  
  // return the resulting function
  return x => sum(x)
}

const add = pipe(add3, add5)

console.log(add(10))