首页 > 解决方案 > 映射到 lambda 函数 JavaScript 中的对象 - 为什么没有括号它不能工作?

问题描述

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

s.map(i => {name: i})

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

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

s.map(i => ({name: i}))

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

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

标签: javascriptarraysobjectecmascript-6

解决方案


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

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

所以,如果你想返回一个对象,你可以把它用括号括起来(这是最简单的方法):

s.map(i => ({ name: i }));

或使用块功能:

s.map(i => {
  return { name: i };
});

(附带说明,您可以通过name作为map参数名称传入来使函数更简洁:

s.map(name => ({ name }));

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

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

推荐阅读