具有对象解构的相同变量名的多个声明

Ale*_*lls 1 javascript node.js

我有这种情况,我想在对象解构中多次使用相同的变量名:

let {body, response} = await requestp('get', `${cdtAPIUrl}/whitelist`, headers);
let parsedBody = await siamese.parse(body);
assert(parsedBody.success, 'response body should have a success property.');
assert(parsedBody.success.length === usernames.length, 'wrong number of items in response body array.');
let {body, response} = await requestp('get', `${cdtAPIUrl}/caches/whitelist`, headers);
let parsedBody = await siamese.parse(body);
Run Code Online (Sandbox Code Playgroud)

但是当我用 node 运行脚本时,node 会在运行前抱怨:

SyntaxError: Identifier 'body' has already been declared
Run Code Online (Sandbox Code Playgroud)

有两个问题使我无法获得简单的解决方案:

  1. 我不能用对象解构来做到这一点:

    let {a,b} = c; {a,b} = c; // not allowed

  2. 我无法重命名bodyor response,因为这是调用返回的内容。

我该怎么办?

也许最好的做法是这样的:

let {body,response} = ...
let {body:body1, response:resp1} = ...
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 5

我不能用对象解构来做到这一点: {a,b} = c;

你可以,你只需要把它放在括号中就可以在语法上有效

({a, b} = c);
Run Code Online (Sandbox Code Playgroud)

也许最好的办法是 let {body:body2, response:resp2} = …

是的,这确实是最好的解决方案。您甚至可能想使用const代替let.

我该怎么办?

另一个解决方案,我不一定会推荐,但只是为了完整性想提一下,是为变量引入单独的范围:

{
  let {body, response} = await requestp('get', `${cdtAPIUrl}/whitelist`, headers);
  let parsedBody = await siamese.parse(body);
  assert(parsedBody.success, 'response body should have a success property.');
  assert(parsedBody.success.length === usernames.length, 'wrong number of items in response body array.');
}
{
  let {body, response} = await requestp('get', `${cdtAPIUrl}/caches/whitelist`, headers);
  let parsedBody = await siamese.parse(body);
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以只使用var代替let,这不会讨厌重新声明。