Можно ли сделать следующее в одной строке в coffeescript?Coffeescript один вкладыш для создания hashmap с переменным ключом
obj = {}
obj[key] = value
Я пробовал:
obj = { "#{key}": value }
, но он не работает.
Можно ли сделать следующее в одной строке в coffeescript?Coffeescript один вкладыш для создания hashmap с переменным ключом
obj = {}
obj[key] = value
Я пробовал:
obj = { "#{key}": value }
, но он не работает.
Для тех, кто считает, что этот вопрос в будущем, так как из CoffeeScript 1.9.1 интерполированного объекта буквальных ключей еще раз поддерживаются!
Синтаксис выглядит следующим образом:
myObject =
a: 1
"#{ 1 + 2 }": 3
См https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2
(obj = {})[key] = value
будет компилировать
var obj;
(obj = {})[key] = value;
Это нормально JavaScript. Единственное преимущество, которое вы получаете от coffeescript, заключается в том, что вам не нужно предварительно объявлять var s
, потому что он делает это за вас.
В зависимости от того, насколько сложным ваш ключ, вы всегда можете использовать имя переменной соответствующий ключ и использовать его, чтобы определить объект, например:
myKey = "Some Value"
obj = {myKey}
Что будет компилировать:
var myKey, obj;
myKey = "Some Value";
obj = {
myKey: myKey
};
Итак, что вы в итоге получаете от , закройте тем, что вы ищете, но для того, чтобы ваши ключи были действительными именами переменных.
It was removed from the language
Извините за опоздание, - если я правильно помню, это было потому, что некоторые из наших других функций языка зависят от наличия ключа, известного в время компиляции. Например, переопределяет метод и супервызов в телах исполняемого класса. Мы хотим знать имя ключа, чтобы можно было построить собственный суперзвонок .
Кроме того, это делает так, что при использовании вы используете объекты замыкания, когда вы используете динамический ключ.
Наконец, есть уже хороший синтаксис для динамических ключей в JavaScript , который явно о том, что вы делаете:
obj[key] = value.
Там что-то хорошее о имеющих
{key: value, key: value}
форму быть ограничены в «чистые» идентификаторах в качестве ключей ,
Если вы используете 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}
NOP AFAIK. Но [LiveScript] (http://livescript.net/) делает это с этим точным синтаксисом. http://codepen.io/elclanrs/pen/gevai – elclanrs
Вы можете сделать '(obj = {}) [key] = val', но это не совсем лучше? Почему это должно быть на одной линии? – phenomnomnominal
@phenomnomnominal Я часто делаю что-то вроде этого: '' 'options = {} options [someVar] = someValue someFunction (options)' '' – jhchen