是否可以在coffeescript的一行中执行以下操作?
obj = {}
obj[key] = value
我试过了:
obj = { "#{key}": value }
但它不起作用。
答案 0 :(得分:4)
(obj = {})[key] = value
将编译为
var obj;
(obj = {})[key] = value;
这是正常的javascript。您从coffeescript获得的唯一好处是您不必预先声明var s
因为它适合您。
答案 1 :(得分:4)
It was removed from the language
抱歉迟到 - 如果我没记错的话,那是因为有些人 我们的其他语言功能取决于知道密钥 编译时间。例如,方法覆盖和超级调用 可执行类主体。我们想知道密钥的名称,以便a 可以建立适当的超级电话。
此外,它使得你必须在使用时关闭包装对象 作为表达式(常见情况),只要你有动态密钥。
最后,JavaScript中的动态键已经有了很好的语法 这是明确的你在做什么:
obj[key] = value.
拥有
{key: value, key: value}
形式有一些好处 被限制为“纯”标识符作为键。
答案 2 :(得分:3)
对于将来发现此问题的任何人,从CoffeeScript 1.9.1开始,再次支持内插对象文字键!
语法如下:
puts hash.to_yaml
请参阅https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2
答案 3 :(得分:1)
根据您的密钥的复杂程度,您始终可以使用与您的密钥匹配的变量名称,并使用它来定义对象,如下所示:
myKey = "Some Value"
obj = {myKey}
将编译为:
var myKey, obj;
myKey = "Some Value";
obj = {
myKey: myKey
};
所以你最终得到的是关闭你所寻求的东西,但这要求你的密钥是有效的变量名。
答案 4 :(得分: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}