在当前范围内从对象的属性创建变量,而无需知道属性名称

时间:2019-04-29 22:25:36

标签: javascript

我有一个对象,并且在当前函数的范围内,我希望能够将其属性转换为相同名称的变量。

下面的代码不起作用,但看起来像这样的起点:

let thingObject = {Thing: "Value",Thing2: "Value2"}

for ([key, value] of Object.entries(thingObject)) {
    eval(`let ${key} = '${value}'`)
}

我知道在浏览器中有一个window对象,在Node.js中有一个global,所以如果我不在乎作用域,我可能会做类似的事情:

for ([key, value] of Object.entries(thingObject)) {
    global[key] = value
}

这要好得多,因为它可以正确保留类型value,但是我需要做很多次而不污染任何全局对象。

对象销毁语法将通过以下方式解决问题:

let {Thing, Thing2} = thingObject

除非我不提前知道按键。

这个answer与另一个问题似乎相关,但我正努力利用它来解决此问题。

如何在不知道当前范围内的属性名称的情况下从对象的属性创建变量?


上下文:

这用于处理模板,模板的创建者将使用模板文字如`${Thing}-other stuff/${Thing2}`

然后,它们将调用我的泛型函数,并传入一个对象,该对象包含其在模板中使用的每个变量的属性。

在调用我的函数时,他们都将知道名称,并在模板中引用这些名称,但是介于两者之间的我的代码将被泛化而不关心任何一方。

使用变量的原因是使模板更整洁,因为必须在模板中包含一些变量容器对象的名称,从而使它们变得比所需的更加冗长,例如:`${VariablesObject.Thing}-other stuff/${VariablesOjbect.Thing2}`

3 个答案:

答案 0 :(得分:1)

您不能,也不应该。如果您不知道这些变量的名称,将如何使用它们? 只需将它们用作对象属性即可使用。它与变量相同,它们已经具有一个范围,即对象本身,因此没有污染。

答案 1 :(得分:0)

您可以使用它来附加键并分配变量:

let thingObject = {Thing: "Value",Thing2: "Value2"}
for ([key, value] of Object.entries(thingObject)) {
    this[key] = value;
    console.log(this[key]);
}

答案 2 :(得分:0)

似乎eval可以使用以下方法来实现:

let variablesObject = {Thing: "Value", Thing2: "Value2"}

let destructureFragment = []
let keys = Object.keys(variablesObject)

for (let i = 0; i < keys.length; i++) {
    destructureFragment.push(`[keys[${i}]]: variablesObject[keys[${i}]]`)
}

let joinedDestructuredFragments = destructureFragment.join(", ")
let destructureStatement = `({${joinedDestructuredFragments}} = variablesObject)`

eval(destructureStatement)

这是行不通的,因为在严格模式下,eval中定义的looks like变量仅在eval中执行的其余代码中可用。

该链接中列出的解决方法在NodeJS 12中也没有:

var geval = eval
geval(destructureStatement)

在这一点上似乎不可能,但是经过更多的思考,有可能将所有需要这些变量的代码都带入eval中并从中获取返回值。全过程。

如果我发现更多信息,将会更新。