将数组项用作对象中的键时出现意外令牌错误

Toa*_*gma 0 javascript arrays associative-array

在Chrome中,以下JavaScript代码会引发意外令牌错误:

var somearray = ["foo","bar"];
var someassoc = {somearray[0]:somearray[1]};
Run Code Online (Sandbox Code Playgroud)

抛出的错误:

Uncaught SyntaxError: Unexpected token [
Run Code Online (Sandbox Code Playgroud)

相反,我希望它应该创建一个具有该键的键somearray[0]和一个项的对象somearray[1].

那么,为什么会这样呢?一个Unexpected Token通常意味着一个支架已经被放错地方等,但这里并非如此.

nir*_*led 6

在 JavaScript 中,当声明一个对象时,键名应该总是一个简单的字符串,例如:

var object = {'key': 'Hello World'};
Run Code Online (Sandbox Code Playgroud)

但是,如果您想使用动态的键名,例如 somearray[0],您需要做的就是将 someassoc 声明为一个对象:

var someassoc = {};
Run Code Online (Sandbox Code Playgroud)

然后,通过执行以下操作来设置键值组合:

someassoc.key = 'Hello World';
Run Code Online (Sandbox Code Playgroud)

或者

someassoc['key'] = 'Hello World';
Run Code Online (Sandbox Code Playgroud)

在您的情况下将是:

someassoc[somearray[0]] = somearray[1];
Run Code Online (Sandbox Code Playgroud)

就这样 :)


zer*_*kms 5

JS对象文字的键必须是静态键或括在其中的表达式[](需要ES2015支持).

您的代码的问题是somearray[0]密钥无效.

因此,如果您需要ES5方式,则将其重写为

var somearray = ["foo","bar"];
var someassoc = {};
someassoc[somearray[0]] = somearray[1];
Run Code Online (Sandbox Code Playgroud)

而对于您使用的ES2015

var somearray = ["foo","bar"];
var someassoc = { [somearray[0]]: somearray[1]};
Run Code Online (Sandbox Code Playgroud)

标准的相关部分:

简而言之:密钥必须是有效的标识符.