例如:
所以:
foo = "asdf"
{foo: "bar"}
eval foo
# how do I get {"asdf": "bar"} ?
# this will throw parse error:
{(eval foo): "bar"}
这是一个简单的语法问题:如何让CoffeeScript动态构建哈希,而不是手工编写?
答案 0 :(得分:38)
你为什么要使用eval
?您可以使用与JavaScript中完全相同的方式执行此操作:
foo = 'asdf'
h = { }
h[foo] = 'bar'
转换为此JavaScript:
var foo, h;
foo = 'asdf';
h = {};
h[foo] = 'bar';
结果是h
看起来像{'asdf': 'bar'}
。
答案 1 :(得分:11)
CoffeeScript与JavaScript一样,不允许您将表达式/变量用作对象文字中的键。这是一个简短的支持,但在0.9.6版本中删除了。您需要在创建对象后设置属性。
foo = 'asdf'
x = {}
x[foo] = 'bar'
alert x.asdf # Displays 'bar'
答案 2 :(得分:7)
有些丑陋,但仍然是单行(抱歉迟到):
{ "#{foo}": bar }
答案 3 :(得分:0)
如果您希望使用Coffeescript的最小语法来定义关联数组,我建议创建一个简单的两行方法,在定义数组后将variable name
键转换为变量值。
我是这样做的(真正的阵列要大得多):
@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 },
答案 4 :(得分:-3)
试试这个:
foo = "asdf"
eval "var x = {#{foo}: 'bar'}"
alert(x.asdf)