1

我在嘗試在定義所有維之前用JavaScript填充多維對象時出現問題。在javascript中初始化'多維'對象

例如,這就是我想做的事:

var multiVar = {}; 
var levelone = 'one'; 
var leveltwo = 'two'; 

multiVar[levelone][leveltwo]['levelthree'] = 'test' 

這將是非常麻煩的必須創建每個維度有這樣一行:

var multiVar = {}; 

multiVar['levelone'] = {}; 
multiVar['levelone']['leveltwo'] = {}; 
multiVar['levelone']['leveltwo']['levelthree'] = 'test' 

我之所以需要沒有迭代啓動的做法是因爲我不知道將會有多少維度以及它將具有哪些密鑰。它需要是動態的。

有沒有辦法以動態的方式做到這一點?

+1

那些不是陣列。 – SLaks

+0

抱歉 - 對象。原則依然。 – Austin

+0

我不明白你想要做什麼。這個是來做什麼的?你將如何填補它?你能舉一個填充物體的例子嗎? –

回答

3

您可以編寫一個函數來確保存在必要的「尺寸」,但是您將無法使用點或括號表示法來獲得此安全性。是這樣的:

function setPropertySafe(obj) 
{ 
    function isObject(o) 
    { 
     if (o === null) return false; 
     var type = typeof o; 
     return type === 'object' || type === 'function'; 
    } 

    if (!isObject(obj)) return; 

    var prop; 
    for (var i=1; i < arguments.length-1; i++) 
    { 
     prop = arguments[i]; 
     if (!isObject(obj[prop])) obj[prop] = {}; 
     if (i < arguments.length-2) obj = obj[prop]; 
    } 

    obj[prop] = arguments[i]; 
} 

實例:

var multiVar = {}; 
setPropertySafe(multiVar, 'levelone', 'leveltwo', 'levelthree', 'test'); 
/* 
multiVar = { 
    levelone: { 
     leveltwo: { 
      levelthree: "test" 
     } 
    } 
} 
*/ 
+1

請注意,您的'isObject'函數將爲'isObject(null)'返回'true',如果您傳遞一個*函數對象*,它將返回'false',這兩種情況都會給您帶來問題。 – CMS

+0

它現在有效。它可能可以使用遞歸更優雅地完成,但是我會把它作爲「練習給讀者」。 '';-) –