【问题标题】:How do these extra parameters work with map()?这些额外的参数如何与 map() 一起使用?
【发布时间】:2018-01-27 21:23:39
【问题描述】:

我正在努力更好地理解 javascript 中的函数式编程,但我对我看到的映射函数的内容感到有些困惑。举个例子:

const f = x => (a, b, c) => b + a;

const arr = [1, 2, 3, 4, 5, 6];

const m = arr.map(f(1));

document.write(m);

当 f 返回 a 时,它将按预期打印每个值。如果它返回 b 它似乎返回索引,并且 c 将返回每个值的整个数组。这个函数为什么会这样工作有什么原因吗?

【问题讨论】:

  • 这个函数没有任何意义。 x 参数如果不在任何地方使用,它的意义何在?使用arr.map(() => arr)也可以达到同样的效果。
  • 是的,x 被留下了,因为我正在玩传递事物并查看它如何影响其他元素。在这种情况下,为了简单起见,我只返回了 c。
  • 请注意,这不是柯里化。
  • @Code-Apprentice 你能帮忙澄清为什么不是吗?对此很陌生,因此它可以帮助我弄清楚我的术语。以为是因为我在传递一个函数。
  • @user3591425 currying(在 JavaScript 的上下文中)是您将一个 arity > 1 的函数转换为一系列一元函数的地方。例如。 const add = (a, b) => a + b;const curriedAdd = a => b => a + b;

标签: javascript ecmascript-6 functional-programming


【解决方案1】:

Array.prototype.map()回调函数有三个默认参数

  1. 迭代的当前元素
  2. 迭代的当前元素的索引
  3. .map() 函数被调用的数组

f 返回一个函数,该函数设置为callback of .map()

另见Array.from()

【讨论】:

  • 所以另一种查看这个函数产生什么的方法是 arr.map((a, b, c) => c)。 a 是迭代的元素,b 是索引,然后 c 是被调用的数组。在正确的轨道上?
  • @user3591425 是
【解决方案2】:

在您的示例中,您正在使用 3 元回调调用 map,其中:
a -> 当前元素
b -> 当前索引
c -> 原始数组

并返回c。因此,您的结果将是一个新数组,其中包含对迭代的每个元素的原始数组的引用。

由于您没有对x 做任何事情,因此这里不需要嵌套函数。如何使用此概念的更好示例如下:

const add = a => b => a + b

const arr = [1, 2, 3, 4]

const newArr = arr.map(add(3))
// [4, 5, 6, 7]
console.log(newArr)

【讨论】:

  • @Damon 你能否在你的例子中添加一些关于两次使用=> 的解释?
  • @BlackBeard 你能给我更多的上下文你在问什么(例如 - 解释它为什么有用或为什么我把它包括在这里?)。 OP 最初在编辑帖子之前提到了柯里化,所以这只是一个简单的例子,说明如何在 javascript 中编写柯里化函数。在许多情况下,这种技术可用于极大地提高函数的可重用性,但在 OP 的示例中它是无操作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2018-12-06
  • 2023-03-02
相关资源
最近更新 更多