0

これを行うには抽象的に十分に考えることができないようです...しかし、配列値をプロパティ名として使用する配列からJavascriptオブジェクトを作成したいのですが、それらは互いにネストされたオブジェクトでなければなりません。

したがって、次のような配列があるとします。

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

私の予想される出力は次のようになります。

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

UPDATE コメントで述べたように、私が使用していた機能は次のとおりです。

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 に答える