考虑以下
var a = {foo: "bar"};
相当于
var a = {};
a.foo = "bar";
相当于
var a = {};
a['foo'] = "bar";
相当于
var a = {}
var b = "foo";
a[b] = "bar";
var b = "foo";
var a = { [b]: "bar" };
结果将是
// => {foo: "bar"}
可接受的解决方案使用JavaScript或CoffeeScript
答案 0 :(得分:6)
使用对象文字表示法无法做到这一点。
更新:根据ECMAScript standard 6.0,您现在可以执行以下操作:
var b = 'foo';
var a = { [b]: 'bar' };
console.log( a.foo ); // "bar"
但是,此解决方案不适用于do not support ES6。
的旧浏览器答案 1 :(得分:5)
ES6支持计算属性。
// code from my original question now works in ES6 !
let b = "foo";
let a = { [b]: "bar" };
a.foo; //=> "bar"
可以在[]
中使用任何表达式来定义属性名称
let a = {
[(xs => xs.join(''))(['f','o','o'])]: 'bar'
};
a.foo; //=> "bar"
如果您需要在ES5世界中依赖此行为,您可以依靠功能强大的babel.js将您的ES6代码转换为与ES5兼容的代码。
答案 2 :(得分:4)
JSON parse允许您将JSON字符串转换为对象:
JSON.parse('{"'+dynamicProperty+'":"bar"}');
这不完全是一个对象,但如果您的目标是将属性名称作为变量输入,则可以使用。
答案 3 :(得分:4)
正如其他人所说,不,目前在CoffeeScript中对象文字中没有插值键字符串的语法;但似乎在某些时候这个功能存在!在这些GitHub问题中,有一些关于它的讨论:#786和#1731。
它在Coco和LiveScript中实现为:
b = 'foo'
a = {"#{b}": 'baz'}
# Or..
a = {(b): 'bar'}
答案 4 :(得分:1)
从CoffeeScript version 1.9.1开始,这有效:
b = "foo"
a = "#{b}": "bar"
汇编为:
var a, b, obj;
b = "foo";
a = (
obj = {},
obj["" + b] = "bar",
obj
);
答案 5 :(得分:0)
的JavaScript
var a, b;
(a = {})[b = 'foo'] = 'bar';
的CoffeeScript
(a = {})[b = 'foo'] = 'bar'
答案 6 :(得分:-1)
要回答你的问题,这是我所知道的唯一方式。它使用eval
。但要注意,eval
是邪恶的!
var b = "foo";
var a = eval('({ ' + b + ': ' + '"bar"' + ' })');
这是一个丑陋的解决方案。为了安全起见,你不应该依赖于此。 不要使用它!