首页 > 解决方案 > 类似于 map 的 ES6 函数

问题描述

我遇到了可能就像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 中调用时没有任何参数?

标签: javascriptarrow-functions

解决方案


首先,您需要了解reduce()函数的作用。这是一篇很棒的文章

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

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

  1. 它正在破坏accum
  2. 它没有被调用,它被传递以便可以在函数中调用它。

总之,reduce是一个高阶函数,它接受一个被调用的函数reducer并递归调用它。现在,整个函数可以重写为仅使用 1 个.reduce()调用,但由于这不是你要问的,所以我不会扮演批评者。


推荐阅读