Подтвердить что ты не робот

В CoffeeScript, как я могу использовать переменную в качестве ключа в хеше?

например:

wtf

Итак:

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

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

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

Это простой вопрос с синтаксисом: как мне заставить CoffeeScript динамически строить хеш, а не делать это вручную?

4b9b3361

Ответ 2

Почему вы используете eval вообще? Вы можете сделать это точно так же, как и в JavaScript:

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

Это переводит на этот JavaScript:

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

И результат в том, что h выглядит как {'asdf': 'bar'}.

Ответ 3

CoffeeScript, как и JavaScript, не позволяет использовать выражения/переменные как ключи в объектных литералах. Это была поддержка ненадолго, но была удалена в версии 0.9.6. Вам нужно установить свойство после создания объекта.

foo = 'asdf'

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

Ответ 4

Несколько уродливый, но однострочный, тем не менее (извините за опоздание):

{ "#{foo}": bar }

Ответ 5

Если вы хотите использовать минимальный синтаксис 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 },

Ответ 6

Попробуйте следующее:

foo = "asdf"

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