2013-02-21 123 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);