2012-08-30 43 views
4

我需要一種方法將對象添加到另一個對象。通常,這是僅如何以編程方式添加到可變嵌套對象?

obj[property] = {'name': bob, 'height': tall} 

但是有問題的對象嵌套所以下面將需要相當簡單:

obj[prop1][prop2] = {'name': bob, 'height': tall} 

的硬道理雖然是嵌套是可變的。那就是我不知道每個新對象在運行前嵌套的深度。 基本上我將產生表示像

「object.secondObj.thirdObj.fourthObj」

然後我需要設置第四對象內部數據的對象路徑的字符串,但我不能使用括號[]方法,因爲我不知道事先需要多少個括號。有沒有辦法做到這一點? 我也使用jQuery,如果這是必要的。

+1

我想你可以使用[建築對象層次從「命名空間」字符串(http://stackoverflow.com/questions/2308783/building-object-hierarchy-from - 一個命名空間字符串)或[Javascript從字符串嵌套對象](http://stackoverflow.com/questions/7640727/javascript-nested-objects-from-string) - 應該不難調整。 –

+0

數據將如何進入創建這些對象及其數據? –

回答

4

當然,你可以使用遞歸或簡單的迭代。我更喜歡遞歸。下面的例子是爲了證明概念,可能不應該用於生產。

var setDeepValue = function(obj, path, value) { 
    if (path.indexOf('.') === -1) { 
     obj[path] = value; 
     return; 
    } 

    var dotIndex = path.indexOf('.'); 
    obj = obj[path.substr(0, dotIndex)]; 

    return setDeepValue(obj, path.substr(dotIndex + 1), value); 
}; 

但是遞歸併不是必須的,因爲在JavaScript中你可以改變引用。

var objPath = 'secondObj.thirdobj.fourthObj'; 
var valueToAdd = 'woot'; 

var topLevelObj = {}; 
var attributes = objPath.split('.'); 
var curObj = topLevelObj; 

for (var i = 0; i < attributes.length; i++) { 
    var attr = attributes[i]; 
    if (typeof curObj[attr] === 'undefined') { 
     curObj[attr] = {}; 
    } 

    curObj = curObj[attr]; 

    if (i === (attributes.length - 1)) { 
     // We're at the end - set the value! 
     curObj['awesomeAttribute'] = valueToAdd; 
    } 
} 
+0

謝謝!這工作完美無瑕。我一直對此感到震驚一段時間:) – Tevis

0

代替生成字符串...

var o="object"; 
//code 
o+=".secondObj"; 
//code 
o+=".thirdObj"; 
//code 
o+=".fourthObj"; 

...你可以做

var o=object; 
//code 
o=o.secondObj; 
//code 
o=o.thirdObj; 
//code 
o=o.fourthObj; 

然後你就可以添加數據是這樣的:

o.myprop='myvalue'; 

而且object將更新爲 變化。

見這裏:http://jsfiddle.net/rFuyG/

相關問題