2011-06-08 55 views
0

我想创建这样一个对象:分配JavaScript对象的内部对象键

var servers = 
{ 
    'local1' : 
    { 
    name: 'local1', 
    ip: '10.10.10.1' 
    }, 
    'local2' : 
    { 
    name: 'local2', 
    ip: '10.10.10.2' 
    } 
} 

这是我在做什么

$.each(servers, function(key, server) 
{ 
    servers[server.name] = server; 
}); 

如果服务器就像是这些对象的数组:

{ 
    name: 'local1', 
    ip: '10.10.10.1' 
} 

但上面的代码不会将任何键指定给对象,所以键默认为0,1,2 ....

+0

那里没有JSON暗示,我删除了对它的引用。 – Quentin 2011-06-08 06:16:46

+0

如何初始化“服务器”? '服务器= []'? 'servers = {}'? – 2011-06-08 06:24:24

+0

'servers = {};' – HyderA 2011-06-08 06:38:31

回答

-5

javascript中的AFAIK []用于索引数组,而要访问对象属性则必须使用点符号。所以你的代码应该是:

$.each(servers, function(key, server) 
{ 
    var name = server.name; 
    eval("servers." + name + " = server"); 
}); 

请试试看,因为我没有测试它。

+1

这是不真实的。您可以并且通常应该使用点符号来访问对象的属性。实际上,在引擎盖下,JavaScript数组是一个对象,其中包含键0,1,2,... – Geoff 2011-06-08 06:20:22

+0

不正确。 ecmascript规范说明点和方括号表示法是等价的。 – joekarl 2011-06-08 06:21:29

+2

Eval是邪恶的,不要使用它! – 2011-06-08 06:22:24

1

我注意到的一个潜在的错误是您正在修改您正在迭代的对象(服务器)。创建一个在循环中修改的新空对象可能会很好。

另外,如果您发布了一些示例数据,那么我们可以为自己运行您的代码,这会有所帮助。

最后,您可以尝试在其中插入一个调试器关键字并逐步完成代码。

0

在Chrome中,如果您运行此:

a = []; 
b = {n:"c",i:"1.2.3.4"}; 
a[b.n] = b; 
alert (a["c"].i); 
alert (a.c.i); 

你会拿到 “1.2.3.4” 字符串作为预期。但是,如果将示例更改为:

a = {}; 
b = {n:"c",i:"1.2.3.4"}; 
a[b.n] = b; 
alert (a.c.i); 

您将再次获得相同的“1.2.3.4”:)。所以答案是:您的代码按照您的要求将属性分配给对象。唯一的区别是在第一个例子中,你使用了数组作为对象,其次是简单的对象。