在CoffeeScript中,如何将variables用作散列中的键?

例如:

WTF

所以:

foo = "asdf" {foo: "bar"} eval foo # how do I get {"asdf": "bar"} ? # this will throw parse error: {(eval foo): "bar"} 

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

对于将来会发现这个问题的任何人,从CoffeeScript 1.9.1插入的对象字面键都被支持!

语法如下所示:

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

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

你为什么使用eval ? 你可以像在JavaScript中一样完成它:

 foo = 'asdf' h = { } h[foo] = 'bar' 

这意味着这个JavaScript:

 var foo, h; foo = 'asdf'; h = {}; h[foo] = 'bar'; 

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

像JavaScript一样,CoffeeScript不允许使用expression式/variables作为对象文字中的关键字。 这是短暂的支持,但在0.9.6版本中被删除。 创build对象后需要设置属性。

 foo = 'asdf' x = {} x[foo] = 'bar' alert x.asdf # Displays 'bar' 

有点难看,但却是单线(抱歉迟到):

{ "#{foo}": bar }

如果您正在寻找使用Coffeescript的最小语法来定义您的关联数组,我build议创build一个简单的两行方法来将variable name键转换为variables值,然后再定义数组。

下面是我如何做(实际数组要大得多):

 @sampleEvents = session_started: K_TYPE: 'session_started' K_ACTIVITY_ID: 'activity' session_ended: K_TYPE: 'session_ended' question_answered: K_TYPE: 'question_answered' K_QUESTION: '1 + 3 = ' K_STUDENT_A: '3' K_CORRECT_A: '4' #optional K_CORRECTNESS: 1 #optional K_SECONDS: 10 #optional K_DIFFICULTY: 4 #optional for k, event of @sampleEvents for key, value of event delete event[key] event[eval(key.toString())] = value 

SampleEvents数组现在是:

 { session_started: { t: 'session_started', aid: 'activity', time: 1347777946.554, sid: 1 }, session_ended: { t: 'session_ended', time: 1347777946.554, sid: 1 }, question_answered: { t: 'question_answered', q: '1 + 3 = ', sa: '3', ca: '4', c: 1, sec: 10, d: 4, time: 1347777946.554, sid: 1 }, 

尝试这个:

 foo = "asdf" eval "var x = {#{foo}: 'bar'}" alert(x.asdf)