2013-02-21 125 views
0

我顯然不能抽象地想到做到這一點...但我想創建一個Javascript對象的陣列使用數組值作爲屬性名稱,但他們應該嵌套對象內彼此。創建一個嵌套的Javascript對象

所以,如果我有一個這樣的數組:

['First', 'Second', 'Third', 'Fourth'] 

我的預期輸出是:

{ 
    First: { 
     Second: { 
      Third: { 
       Fourth: {} 
      } 
     } 
    } 
} 

UPDATE 下面是我用的是作爲commment提到的功能:

function appendKey(obj, to, key) { 
    if (obj.hasOwnProperty(to)) { 
     appendKey(obj[to], to, key); 
    } else { 
     obj[key] = {}; 
    } 

    return obj; 
} 

我的inte NT是稱呼其爲這樣的:

var data = ['First', 'Second', 'Third', 'Fourth']; 
data = appendKey(data, 'First', 'Second'); 
data = appendKey(data, 'Second', 'Third'); 
data = appendKey(data, 'Third', 'Fourth'); 

清楚,可以被放入一個循環,這就是爲什麼我想這樣做的。我的輸出最終被:

data = { 'First' : { 'Second' } } // it works this time! 

data = { 'First' : { 'Second' }, 
     'Third' : { } } 

data = { 'First' : { 'Second' }, 
     'Third' : { 'Fourth' { } } } 
+1

[?你嘗試過什麼(http://whathaveyoutried.com) – 2013-02-21 16:56:20

+0

我嘗試了一個自調用函數,它將原樣提取對象和要添加的密鑰。如果鍵不存在,則將其添加到傳遞的對象並返回。如果鍵存在,它會再次調用它自己,但在第一個參數中使用'object.key'。 – 2013-02-21 17:02:02

+0

@HonusWagner:它做了什麼,它做了什麼?你能告訴我們代碼嗎? – Martijn 2013-02-21 17:03:24

回答

5

循環外,您的基礎對象存儲在一個變量,並且有一個單獨的變量來存儲當前對象(這開始了是相同的爲基準)

在循環中,取「當前」對象,使用當前數組成員給它一個鍵,爲該鍵分配一個新對象,並將該新對象作爲新的「當前」對象。

var arr = ['First', 'Second', 'Third', 'Fourth'], 
    obj = {}, 
    currObj = obj; 

arr.forEach(function(key) { 
    currObj = (currObj[key] = {}); 
}); 

console.log(obj); // {First:{Second:{Third:{Fourth:{}}}}} 

DEMO:http://jsfiddle.net/qunDt/


,如果你願意,也可以放鬆在forEach位的代碼。

arr.forEach(function(key) { 
    currObj[key] = {}; 
    currObj = currObj[key]; 
}); 

如果你想要一個純粹的遞歸方法,你可以做這樣的:

function nested(list, o) { 
    if (list.length === 0) 
     return o; 
    o[list.shift()] = nested(list, {}) 
    return o; 
} 

var obj = nested(arr, {}); 
1
var names = ['First', 'Second', 'Third', 'Fourth']; 

var build = function(soFar,remaining) { 
    if(remaining.length === 0) {return soFar;} 
    var outer = {}; 
    outer[names.pop()] = soFar; 
    return build(outer, names); 
} 

var result = build({}, names);