JavaScript对象解构和别名

Set*_*eth 7 javascript ecmascript-6 babeljs

有没有办法在JavaScript中构造一个对象并将其作为别名的本地解构对象?

就像是:

const env = {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
Run Code Online (Sandbox Code Playgroud)

...并且已env成为包含所选环境变量的局部常量.(我知道我的例子不适用于babel)

{
  ENV_VAR_X: "s867c7dsj4lal7", 
  ENV_VAR_Y: "hd73m20s-a=snf77f", 
  ENV_VAR_Z: "production"
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这种混叠?

另外,我使用babel作为我的转换程序,然后使用节点运行脚本,以便我可以利用更多ECMAScript 6功能.

小智 10

根据我对规范的解读,这应该是可以解析的,但这并不意味着你的想法.它将从右到左解析为

const env = ({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env);
Run Code Online (Sandbox Code Playgroud)

在哪里生产

({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env)
Run Code Online (Sandbox Code Playgroud)

像所有其他任务一样,定义为对RHS的评估,即process.env.

因此,您的代码相当于

const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = process.env;
Run Code Online (Sandbox Code Playgroud)

验证这个很容易:

const foo = {a: 1, b: 2};
const bar = {a} = foo;
Run Code Online (Sandbox Code Playgroud)

如您所期望的那样,导致a使用该值声明一个新的常量1.然而,该值bar不是一个"别名解构对象",这将是{a: 1}; 它是一样的foo,是的{a: 1, b: 2}.bar === foo.


您正在尝试做的事已在SO上和ES讨论组中多次讨论过.底线是没有办法做到这一点.你所能做的就是:

const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
Run Code Online (Sandbox Code Playgroud)

换句话说,没有办法"从一个对象解构成一个对象",或"从一个对象中挑选一个对象".您只能将对象解构为变量.

你可以回归过去的老式方式:

const env = {ENV_VAR_X: process.env.ENV_VAR_X, ...
Run Code Online (Sandbox Code Playgroud)

我知道这很可怕.

您可以使用pick下划线中的函数或编写自己的函数,但这需要您说

const env = _.pick(process.env, 'ENV_VAR_X', "ENV_VAR_Y', 'ENV_VAR_Z');
Run Code Online (Sandbox Code Playgroud)

这只是稍微不那么可怕了.

我们为ES7提出了"休息属性"和"传播属性",但它们似乎对我们没有帮助.


我们需要的是一种将属性选择到另一个对象的新语法.已经提出了各种各样的建议,其中没有一个得到很大的牵引力.一个是"扩展点符号",它允许将一个卷曲括号的结构放在一个点之后.在你的情况下,你会写

const env = process.env.{ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
                       ^^
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关此提案的更多信息.


Ami*_*nam 10

要为已破坏的值分配新名称,只需使用以下命令:

obj = {x: 10, y: "Something"};
const { x: otherName } = obj;
Run Code Online (Sandbox Code Playgroud)