例えば:
そう:
foo = "asdf"
{foo: "bar"}
eval foo
# how do I get {"asdf": "bar"} ?
# this will throw parse error:
{(eval foo): "bar"}
これは簡単な構文の質問です。CoffeeScriptでハッシュを手動で作成するのではなく、動的に作成するにはどうすればよいですか?
CoffeeScript 1.9.1現在、補間されたオブジェクトリテラルキーがサポートされているので、将来この質問を見つけた人は誰でもサポートしています!
構文は次のようになります。
myObject =
a: 1
"#{ 1 + 2 }": 3
https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2 を参照してください
なぜeval
を使用しているのですか? JavaScriptで行うのとまったく同じ方法で行うことができます。
foo = 'asdf'
h = { }
h[foo] = 'bar'
これは次のJavaScriptに変換されます。
var foo, h;
foo = 'asdf';
h = {};
h[foo] = 'bar';
その結果、h
は{'asdf': 'bar'}
のようになります。
JavaScriptと同様、CoffeeScriptでは、オブジェクトリテラルのキーとして式/変数を使用できません。これは短時間のサポートでしたが、バージョン0.9.6で削除されました。オブジェクトを作成した後、プロパティを設定する必要があります。
foo = 'asdf'
x = {}
x[foo] = 'bar'
alert x.asdf # Displays 'bar'
多少いですが、それでもワンライナーです(遅れてすみません):
{ "#{foo}": bar }
連想配列を定義するために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 },