43 votes

dans CoffeeScript, comment puis-je utiliser une variable comme clé dans un hachage ?

par exemple:

wtf

Donc:

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

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

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

C'est une question de syntaxe simple : comment faire pour que CoffeeScript construise un hachage dynamiquement, plutôt que de le faire à la main ?

45voto

bcherny Points 1932

Pour tous ceux qui trouveront cette question à l'avenir, à partir de CoffeeScript 1.9.1, les clés littérales d'objet interpolées sont prises en charge !

La syntaxe ressemble à ceci :

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

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

39voto

mu is too short Points 205090

Pourquoi utilisez-vous eval ? Vous pouvez le faire exactement de la même manière que vous le feriez en JavaScript :

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

Cela se traduit par ce JavaScript :

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

Et le résultat est que h ressemble à {'asdf': 'bar'} .

11voto

Jeremy Banks Points 32470

CoffeeScript, comme JavaScript, ne vous permet pas d'utiliser des expressions/variables comme clés dans les littéraux d'objet. Cela a été brièvement pris en charge, mais a été supprimé dans la version 0.9.6. Vous devez définir la propriété après avoir créé l'objet.

 foo = 'asdf'

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

8voto

Danyel Points 826

Un peu moche mais une ligne quand même (désolé d'être en retard):

{ "#{foo}": bar }

0voto

Ben Gotow Points 7627

Si vous cherchez à utiliser la syntaxe minimale de Coffeescript pour définir votre tableau associatif, je suggère de créer une méthode simple à deux lignes pour convertir les variable name en valeurs variables après avoir défini le tableau.

Voici comment je procède (le tableau réel est beaucoup plus grand):

 @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

Le SampleEvents est maintenant :

 { 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 },

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X