web-dev-qa-db-ja.com

CoffeeScriptでは、変数をハッシュのキーとしてどのように使用できますか?

例えば:

wtf

そう:

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

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

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

これは簡単な構文の質問です。CoffeeScriptでハッシュを手動で作成するのではなく、動的に作成するにはどうすればよいですか?

41
Giles Bowkett

CoffeeScript 1.9.1現在、補間されたオブジェクトリテラルキーがサポートされているので、将来この質問を見つけた人は誰でもサポートしています!

構文は次のようになります。

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

https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2 を参照してください

44
bcherny

なぜevalを使用しているのですか? JavaScriptで行うのとまったく同じ方法で行うことができます。

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

これは次のJavaScriptに変換されます。

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

その結果、h{'asdf': 'bar'}のようになります。

38
mu is too short

JavaScriptと同様、CoffeeScriptでは、オブジェクトリテラルのキーとして式/変数を使用できません。これは短時間のサポートでしたが、バージョン0.9.6で削除されました。オブジェクトを作成した後、プロパティを設定する必要があります。

foo = 'asdf'

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

多少いですが、それでもワンライナーです(遅れてすみません):

{ "#{foo}": bar }

7
Danyel

連想配列を定義するためにCoffeescriptの最小構文を使用する場合は、配列を定義した後にvariable nameキーを変数値に変換する簡単な2行のメソッドを作成することをお勧めします。

以下にその方法を示します(実際の配列ははるかに大きくなります)。

@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 },
0
Ben Gotow