在CoffeeScript中,如何将变量用作哈希中的键?

Gil*_*ett 42 hashmap literals coffeescript

例如:

WTF

所以:

foo = "asdf"
{foo: "bar"}
eval foo

# how do I get {"asdf": "bar"} ?

# this will throw parse error:
{(eval foo): "bar"}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的语法问题:如何让CoffeeScript动态构造哈希,而不是手工完成?

bch*_*rny 45

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

语法如下所示:

myObject =
  a: 1
  "#{ 1 + 2 }": 3
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2


mu *_*ort 38

你为什么一直在使用eval?您可以使用与在JavaScript中执行此操作完全相同的方式执行此操作:

foo    = 'asdf'
h      = { }
h[foo] = 'bar'
Run Code Online (Sandbox Code Playgroud)

这转换为这个JavaScript:

var foo, h;
foo = 'asdf';
h = {};
h[foo] = 'bar';
Run Code Online (Sandbox Code Playgroud)

结果是h看起来像{'asdf': 'bar'}.


小智 11

与JavaScript一样,CoffeeScript不允许您将表达式/变量用作对象文字中的键.这是一个简短的支持,但在0.9.6版本中删除了.您需要在创建对象后设置属性.

foo = 'asdf'

x = {}
x[foo] = 'bar'
alert x.asdf # Displays 'bar'
Run Code Online (Sandbox Code Playgroud)


Dan*_*yel 7

虽然有些丑陋但仍然是单行的(抱歉迟到):

{ "#{foo}": bar }

  • 根据您的coffeescript版本,这可能无法实现. (3认同)

Lai*_*uan -3

尝试这个:

foo = "asdf"

eval "var x = {#{foo}: 'bar'}"
alert(x.asdf)
Run Code Online (Sandbox Code Playgroud)