0

我显然不能抽象地思考这样做......但我想从一个使用数组值作为属性名称的数组中创建一个 Javascript 对象,但它们应该是相互嵌套的对象。

所以如果我有一个这样的数组:

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

我的预期输出是:

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

更新 这是我在评论中提到的使用的功能:

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

    return obj;
}

我的意图是这样称呼它:

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' { } } } 
4

2 回答 2

5

在循环之外,将基础对象存储在一个变量中,并有一个单独的变量来存储当前对象(开始时与基础对象相同)

在循环内部,获取“当前”对象,使用当前数组成员为其指定一个键,为该键分配一个新对象,并使该新对象成为新的“当前”对象。

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

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

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

演示: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, {});
于 2013-02-21T17:03:47.800 回答
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);
于 2013-02-21T17:06:47.483 回答