类似map的ES6功能

ES6 function similar to map

我遇到了可能类似于 map 函数的代码,但我不理解所有语义。查看此代码:

const reduce = (reducer, accumulator) => arr => {
    const [first, ...rest] = arr
    return arr.length
     ? reduce(reducer, reducer(accumulator, first))(rest)
     : accumulator
}

reduce((accum, current) => [...accum, current * 2], [])([1, 2, 3]);

你能解释一下这段代码是如何工作的吗?

  1. 为什么 ...accum 是第一个 arg 但应该是最后一个并且恰好 ...accum 在这个例子中意味着什么?

  2. 为什么在 reduce 中调用第一个 reducer 时没有任何参数?

首先您需要了解 reduce() 函数的作用。这是一个很棒的 article.

简而言之,它用于从列表中累加值。不一定是总和,但您可以将其用于需要基于列表所有元素的结果的操作。

您的代码似乎是从列表中获取所有元素,并将其乘以 2。这就像 [...accum, current * 2] 基本上创建了一个数组,其中包含 accum 数组中的所有值,并且乘法结果。 (参见 destructuring

  1. 正在解构 accum
  2. 中的值
  3. 它没有被调用,它被传递以便可以在函数中调用它。

综上所述,reduce是一个高阶函数,它接受一个名为reducer的函数并递归调用它。现在,整个函数可以重写为仅使用 1 个 .reduce() 调用,但由于这不是您要的,所以我不会批评。