Hon*_*ner 0 javascript arrays dynamic-arrays javascript-objects
我显然无法抽象地思考这个...但我想从一个使用数组值作为属性名的数组中创建一个Javascript对象,但它们应该是彼此嵌套的对象.
所以,如果我有这样的数组:
['First', 'Second', 'Third', 'Fourth']
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
{
First: {
Second: {
Third: {
Fourth: {}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新 这是我在提交中提到的函数:
function appendKey(obj, to, key) {
if (obj.hasOwnProperty(to)) {
appendKey(obj[to], to, key);
} else {
obj[key] = {};
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
我的意图是这样称呼它:
var data = ['First', 'Second', 'Third', 'Fourth'];
data = appendKey(data, 'First', 'Second');
data = appendKey(data, 'Second', 'Third');
data = appendKey(data, 'Third', 'Fourth');
Run Code Online (Sandbox Code Playgroud)
很明显,这可以放入循环,这就是为什么我想这样做.我的输出结果是:
data = { 'First' : { 'Second' } } // it works this time!
data = { 'First' : { 'Second' },
'Third' : { } }
data = { 'First' : { 'Second' },
'Third' : { 'Fourth' { } } }
Run Code Online (Sandbox Code Playgroud)
在循环外部,将基础对象存储在变量中,并有一个单独的变量来存储当前对象(从基础开始是相同的).
在循环内部,获取"当前"对象,使用当前数组成员为其指定一个键,为该键指定一个新对象,并使该新对象成为新的"当前"对象.
var arr = ['First', 'Second', 'Third', 'Fourth'],
obj = {},
currObj = obj;
arr.forEach(function(key) {
currObj = (currObj[key] = {});
});
console.log(obj); // {First:{Second:{Third:{Fourth:{}}}}}
Run Code Online (Sandbox Code Playgroud)
演示: http ://jsfiddle.net/qunDt/
forEach 如果您愿意,可以稍微解开代码.
arr.forEach(function(key) {
currObj[key] = {};
currObj = currObj[key];
});
Run Code Online (Sandbox Code Playgroud)
如果你想要一个纯粹的递归方法,你可以这样做:
function nested(list, o) {
if (list.length === 0)
return o;
o[list.shift()] = nested(list, {})
return o;
}
var obj = nested(arr, {});
Run Code Online (Sandbox Code Playgroud)