在CoffeeScript中,如何将variables用作散列中的键?
例如:
所以:
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)