2011-06-08 53 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」:)。所以答案是:您的代碼按照您的要求將屬性分配給對象。唯一的區別是在第一個例子中,你使用了數組作爲對象,其次是簡單的對象。