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

时间:2011-10-08 20:11:00

标签: coffeescript hashmap literals

例如:

wtf

所以:

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

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

# this will throw parse error:
{(eval foo): "bar"}

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

5 个答案:

答案 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)