4

是否可以在咖啡脚本的一行中执行以下操作?

obj = {}
obj[key] = value

我试过了:

obj = { "#{key}": value }

但它不起作用。

4

5 回答 5

4
(obj = {})[key] = value

将编译为

var obj;

(obj = {})[key] = value;

这是普通的javascript。您从 coffeescript 中获得的唯一好处是您不必预先声明var s,因为它会为您完成。

于 2013-11-14T00:38:34.747 回答
4

它已从语言中删除

抱歉迟到了——如果我没记错的话,那是因为我们的一些其他语言特性依赖于在编译时知道密钥。例如,可执行类主体中的方法覆盖和超级调用。我们想知道键的名称,以便可以构造正确的超级调用。

此外,它使您在用作表达式(常见情况)时必须关闭包装对象,只要您有一个动态键。

最后,在 JavaScript 中已经有一个很好的动态键语法,它明确说明了你在做什么:obj[key] = value.

{key: value, key: value}表单限制为“纯”标识符作为键有一些好处。

于 2013-11-14T00:43:10.293 回答
3

对于将来发现此问题的任何人,从 CoffeeScript 1.9.1 开始,再次支持插值对象文字键!

语法如下所示:

myObject =
  a: 1
  "#{ 1 + 2 }": 3

https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2

于 2015-04-29T16:54:59.407 回答
1

如果您使用underscore,则可以使用该_.object函数,它是该函数的逆_.pairs函数。

_.pairs({a: 1, b: 'hello'})
//=> [['a', 1], ['b', 'hello']]

_.object([['a', 1], ['b', 'hello']])
//=> {a: 1, b: 'hello'}

myKey = 'superkey'因此,假设myValue = 100您可以使用:

var obj = _.object([[myKey, myValue]]);
//=> obj = {superkey: 100}
于 2015-02-12T17:34:09.927 回答
1

根据您的密钥的复杂程度,您始终可以使用与您的密钥匹配的变量名称并使用它来定义对象,如下所示:

myKey = "Some Value"
obj = {myKey}

这将编译为:

var myKey, obj;

myKey = "Some Value";

obj = {
  myKey: myKey
};

所以你最终得到的是接近你所寻求的东西,但这需要你的键是有效的变量名。

于 2013-11-14T00:41:45.160 回答