10

考虑以下

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

4

7 回答 7

6

不。

没有办法使用对象文字表示法来做到这一点。


更新:根据ECMAScript 标准 6.0,您现在可以执行以下操作:

var b = 'foo';
var a = { [b]: 'bar' };

console.log( a.foo );  // "bar"

但是,此解决方案不适用于不支持 ES6的旧浏览器。

于 2012-12-21T22:02:22.797 回答
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 兼容代码。

于 2015-06-11T19:04:36.103 回答
4

JSON 解析允许您将 JSON 字符串转换为对象:

JSON.parse('{"'+dynamicProperty+'":"bar"}');

这不完全是一个对象文字,但如果您的目标是输入您的属性名称作为变量,它可以工作。

于 2012-12-21T22:29:44.923 回答
4

正如其他人所说,不,目前在 CoffeeScript 的对象文字中没有用于插入键字符串的语法;但似乎在某些时候这个功能存在!在这些 GitHub 问题中,有一些关于它的讨论:#786#1731

它在CocoLiveScript中实现为:

b = 'foo'
a = {"#{b}": 'baz'}

# Or..
a = {(b): 'bar'}
于 2012-12-22T00:24:08.900 回答
1

从 CoffeeScript版本 1.9.1开始,这有效:

b = "foo"
a = "#{b}": "bar"

它编译为:

var a, b, obj;

b = "foo";

a = (
  obj = {},
  obj["" + b] = "bar",
  obj
);

试试看

于 2015-09-19T04:15:36.723 回答
0

JavaScript

var a, b;
(a = {})[b = 'foo'] = 'bar';

咖啡脚本

(a = {})[b = 'foo'] = 'bar'
于 2012-12-21T22:03:10.700 回答
-1

要回答您的问题,这是我所知道的唯一方法。它使用eval. 但要小心,eval是邪恶的!

var b = "foo";
var a = eval('({ ' + b + ': ' + '"bar"' + ' })');

这是一个丑陋的解决方案。为了安全起见,你不应该依赖这个。不要使用它!

于 2012-12-21T22:15:47.653 回答