分析错误:意外的令牌,预期的","和语法错误:意外的令牌'['



app.js

let ids = [1, 2, 3];
let obj = {};
for (let i in ids) {
obj = { ...obj, ids[i]: "" };   
}
console.log(obj);

在执行上面的代码时,我得到了下面的错误。

Parsing error: Unexpected token, expected ","
4 |
5 | for (let i in ids) {
> 6 |   obj = { ...obj, ids[i]: "" };  
|                      ^
7 | }
8 |
9 | console.log(obj);eslint

当我将鼠标悬停在VS代码中的obj = { ...obj, ids[i]: "" };行上方时,会出现此错误。

当我使用节点运行代码时,即在node app.js上。我在我的终端中得到以下错误:

obj = { ...obj, ids[i]: "" };  
^
SyntaxError: Unexpected token '['
at wrapSafe (internal/modules/cjs/loader.js:988:16)
at Module._compile (internal/modules/cjs/loader.js:1036:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
at Module.load (internal/modules/cjs/loader.js:937:32)
at Function.Module._load (internal/modules/cjs/loader.js:778:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at internal/main/run_main_module.js:17:47

我做错了什么?我希望最后obj的值是{1 : "", 2 : "", 3: ""}

有几种解决方案。

  1. 将其包裹在支架上:
for (let i in ids) {
obj = { ...obj, [ids[i]]: "" }; // Brackets make it act as a key name instead of something else
}
  1. 简单易行的方法:
for (let i in ids) {
obj[ids[i]] = ""; // This adds a value
}

使用[ids[i]]而不是ids[i]

let ids = [1, 2, 3];
let obj = {};
for (let i in ids) {
obj = { ...obj, [ids[i]]: "" };
}
console.log(obj);

is[i]是应该解析运行时的key,因此应该将其设为computed property names

从ECMAScript 2015开始,对象初始值设定项语法支持计算属性名称。这允许你放置一个表达式在方括号[]中,将计算并用作属性名称。这让人想起属性访问器的括号表示法语法,您可能已经使用它来读取和设置属性了。-MDN-

let ids = [1, 2, 3];
let obj = {};
for (let i in ids) {
obj = { ...obj, [ids[i]]: "" };
}
console.log(obj);

如果您想将""动态设置为对象中的每个id作为密钥,我建议您这样做:

let obj = {}let ids = [1,2,3]

ids.forEach((id) => {
obj[id] = '';
});

对象将是{ '1': '', '2': '', '3': ''}