从JavaScript对象提取键并用作变量

从JavaScript对象提取键并用作变量,javascript,arrays,object,extract,Javascript,Arrays,Object,Extract,PHP中有一个名为extract的方法,它正是我在这里想要做的。假设我有一个如下所示的对象: var data = { name: "Olly" age: 19 }; function myTestFunction() { var data = { name: "Olly", age: 19, }; for (var key in data) { this[key] = data[key]; }

PHP中有一个名为
extract
的方法,它正是我在这里想要做的。假设我有一个如下所示的对象:

var data = {
    name: "Olly"
    age: 19
};
function myTestFunction() {
    var data = {
        name: "Olly",
        age: 19,
    };
    for (var key in data) {
        this[key] = data[key];
    }
    alert(name +" is "+ age +"!");
}
myTestFunction();
我想运行一个类似
extract(data)
的方法,这样我就可以通过使用
name
age
而不是
data.name
data.age
来访问该对象中的属性


我在谷歌上搜索了一下,什么也找不到。

你可以用这样的方法:

var data = {
    name: "Olly"
    age: 19
};
function myTestFunction() {
    var data = {
        name: "Olly",
        age: 19,
    };
    for (var key in data) {
        this[key] = data[key];
    }
    alert(name +" is "+ age +"!");
}
myTestFunction();
(在这里试试:)

甚至可以使用
window[key]=data[key]
将它们导出到全局名称空间。 在任何情况下,都要非常小心,因为破坏全局名称空间/重写其他内容/等的风险非常高

更新:通用
extract()

下面是更通用的/多级/循环命名空间提取器:)


这似乎就像“with”语句一样

var data = {
    name: "Olly",
    age: 19,
};
with(data){
    alert(name +" is "+ age +"!"); //"Olly is age 19!"
    name = "Charlie";
    age = 28;
    alert(data.name +" is "+ data.age +"!"); //"Charlie is age 28!"
}
alert(data.name +" is "+ data.age +"!"); //"Charlie is age 28!"

你使用的是像Yahoo YUI或Google Closure这样的小型化程序或优化器吗?我想Javascript的
with
语句与PHP的
extract
方法更为相似。也就是说,
的结合并不常见,除非您真正理解它的工作原理,否则我不会使用它。看@KrisKrause不,我不是。为什么会这样问?更新为修复命名:它被称为
extract()
,而不是
export()
:)通过在函数中说这个[key]=data[key],您不是已经对全局对象进行了重击吗?还请注意,
将在该函数的严格模式下未定义,因此将抛出一个errorYep,如果您是从全局命名空间中的函数运行该函数,则是正确的。。最好从一个对象实例方法运行,或者根本不用它;但既然他问了“如何做到这一点…”那么,+1,但在这样的背景下传递是老生常谈,不是吗?为什么不像以前那样保留
this
,然后使用
call
调用函数,并以这种方式指定
this
值呢?它只会将变量添加到全局对象(窗口)中,使用
with
is,MDN文档中列出了几个对立面。对不起,我知道这个评论有多老了,但我相信这些都是相关的评论。