是否可以在咖啡脚本的一行中执行以下操作?
obj = {}
obj[key] = value
我试过了:
obj = { "#{key}": value }
但它不起作用。
是否可以在咖啡脚本的一行中执行以下操作?
obj = {}
obj[key] = value
我试过了:
obj = { "#{key}": value }
但它不起作用。
(obj = {})[key] = value
将编译为
var obj;
(obj = {})[key] = value;
这是普通的javascript。您从 coffeescript 中获得的唯一好处是您不必预先声明var s
,因为它会为您完成。
抱歉迟到了——如果我没记错的话,那是因为我们的一些其他语言特性依赖于在编译时知道密钥。例如,可执行类主体中的方法覆盖和超级调用。我们想知道键的名称,以便可以构造正确的超级调用。
此外,它使您在用作表达式(常见情况)时必须关闭包装对象,只要您有一个动态键。
最后,在 JavaScript 中已经有一个很好的动态键语法,它明确说明了你在做什么:
obj[key] = value.
将
{key: value, key: value}
表单限制为“纯”标识符作为键有一些好处。
对于将来发现此问题的任何人,从 CoffeeScript 1.9.1 开始,再次支持插值对象文字键!
语法如下所示:
myObject =
a: 1
"#{ 1 + 2 }": 3
见https://github.com/jashkenas/coffeescript/commit/76c076db555c9ac7c325c3b285cd74644a9bf0d2
如果您使用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}
根据您的密钥的复杂程度,您始终可以使用与您的密钥匹配的变量名称并使用它来定义对象,如下所示:
myKey = "Some Value"
obj = {myKey}
这将编译为:
var myKey, obj;
myKey = "Some Value";
obj = {
myKey: myKey
};
所以你最终得到的是接近你所寻求的东西,但这需要你的键是有效的变量名。