映射到 lambda 函数 JavaScript 中的对象 - 为什么没有括号就不能工作?

Tim*_*eng 6 javascript arrays object ecmascript-6

我正在节点中运行以下命令,但无法理解为什么一个有效而另一个无效。这里我有一个数组 s,其中 s = [1, 2, 3, 4]。我想将每个数字映射到一个对象。我已经尝试这个很长时间了:

s.map(i => {name: i})
Run Code Online (Sandbox Code Playgroud)

它返回一个未定义的列表。

最后我意识到它与括号一起工作:

s.map(i => ({name: i}))
Run Code Online (Sandbox Code Playgroud)

这提供了我想要的输出:[ { name: 1 }, { name: 2 }, { name: 3 }, { name: 4 } ]

我觉得有一个 JavaScript 概念我不理解。为什么这不起作用?

Jac*_*ord 10

这是因为=> {代表一个块函数,而不是返回一个对象。

将对象括在括号中不会执行任何操作,它只是中断该模式=> {,这意味着它被解释为简洁的箭头函数而不是块箭头函数,并且您可以返回该对象。

因此,如果你想返回一个对象,你可以将它括在括号中(这是最简单的方法):

s.map(i => ({ name: i }));
Run Code Online (Sandbox Code Playgroud)

或者使用块函数:

s.map(i => {
  return { name: i };
});
Run Code Online (Sandbox Code Playgroud)

name(顺便说一句,您可以通过作为参数名称传入来使您的函数更加简洁map

s.map(name => ({ name }));
Run Code Online (Sandbox Code Playgroud)

正如下面Tomasz所指出的,您第一次尝试返回列表的原因undefined是因为JavaScript 中标签name:的语法- 并且您只是标记然后声明变量- 所以您的代码基本上看起来像这样的 ES5:name:i

s.map(function(i) {
  name: i
  // No return so it returns `undefined`
});
Run Code Online (Sandbox Code Playgroud)