2013-11-14 2 views
4

Можно ли сделать следующее в одной строке в coffeescript?Coffeescript один вкладыш для создания hashmap с переменным ключом

obj = {} 
obj[key] = value 

Я пробовал:

obj = { "#{key}": value } 

, но он не работает.

+0

NOP AFAIK. Но [LiveScript] (http://livescript.net/) делает это с этим точным синтаксисом. http://codepen.io/elclanrs/pen/gevai – elclanrs

+0

Вы можете сделать '(obj = {}) [key] = val', но это не совсем лучше? Почему это должно быть на одной линии? – phenomnomnominal

+0

@phenomnomnominal Я часто делаю что-то вроде этого: '' 'options = {} options [someVar] = someValue someFunction (options)' '' – jhchen

ответ

4
(obj = {})[key] = value 

будет компилировать

var obj; 

(obj = {})[key] = value; 

Это нормально JavaScript. Единственное преимущество, которое вы получаете от coffeescript, заключается в том, что вам не нужно предварительно объявлять var s, потому что он делает это за вас.

1

В зависимости от того, насколько сложным ваш ключ, вы всегда можете использовать имя переменной соответствующий ключ и использовать его, чтобы определить объект, например:

myKey = "Some Value" 
obj = {myKey} 

Что будет компилировать:

var myKey, obj; 

myKey = "Some Value"; 

obj = { 
    myKey: myKey 
}; 

Итак, что вы в итоге получаете от , закройте тем, что вы ищете, но для того, чтобы ваши ключи были действительными именами переменных.

4

It was removed from the language

Извините за опоздание, - если я правильно помню, это было потому, что некоторые из наших других функций языка зависят от наличия ключа, известного в время компиляции. Например, переопределяет метод и супервызов в телах исполняемого класса. Мы хотим знать имя ключа, чтобы можно было построить собственный суперзвонок .

Кроме того, это делает так, что при использовании вы используете объекты замыкания, когда вы используете динамический ключ.

Наконец, есть уже хороший синтаксис для динамических ключей в JavaScript , который явно о том, что вы делаете: obj[key] = value.

Там что-то хорошее о имеющих {key: value, key: value} форму быть ограничены в «чистые» идентификаторах в качестве ключей ,

1

Если вы используете underscore, вы можете использовать функцию _.object, которая является обратной функции _.pairs.

_.pairs({a: 1, b: 'hello'}) 
//=> [['a', 1], ['b', 'hello']] 

_.object([['a', 1], ['b', 'hello']]) 
//=> {a: 1, b: 'hello'} 

Таким образом, если предположить myKey = 'superkey' и myValue = 100 вы могли бы использовать:

var obj = _.object([[myKey, myValue]]); 
//=> obj = {superkey: 100} 
Смежные вопросы