2014-08-31 61 views
0

我如何轉換一個簡單的數組是這樣的:['foo', 'bar', 'baz']一個對象是這樣的:轉換數組對象包括

{ 'foo': { 
    'bar': { 
     'baz' : {} 
    } 
    } 
} 

這看起來很簡單,但我不能弄明白。

+2

你有什麼嘗試?告訴我們你的嘗試。它確實應該是一個簡單的遞歸函數或者向後循環。 – Bergi 2014-08-31 16:56:25

回答

1

你應該使用Array#reduceRight

function arrayToNestedObject(arr) { 

    // Proceeding from the end of the array back towards the beginning... 
    return arr.reduceRight(function(prev, cur) { 

     // Create a new object with a property named by the array element, 
     // whose value is what we have got so far 
     return Object.defineProperty({}, cur, {value: prev}); 

    }, {}); 
} 

測試:

arrayToNestedObject(['foo', 'bar', 'baz'] 
> {foo: {bar: {baz: {} } } } 

注意Object.defineProperty({}, prop, {value: val})是一個方便的在線速記爲

var x = {}; 
x[prop] = val; 
return x; 

在ES6,使用「計算屬性」,上面將僅僅是

arrayToNestedObject = (arr) => arr.reduceRight((prev, cur) => ({[cur]: prev})); 

如果一個更喜歡遞歸溶液,還更好地從右側進行,使用pop

function arrayToNestedObject(arr) { 
    return (function _(arr, obj) { 
     var val = arr.pop(); 
     return val ? _(arr, Object.defineProperty({}, val, {value: obj})) : obj; 
    }(arr, {})); 
} 

arrayToNestedObject(['foo', 'bar']) 
> { foo: { bar: { } } } 
2

我想這是你想要的東西:

function arrayToNestedObject(arr) { 
    var obj = {}, 
     current = obj; 

    for(var i = 0; i < arr.length; i++) { 
     var key = arr[i]; 
     current = current[key] = {}; 
    } 

    return obj; 
} 

console.log(arrayToNestedObject(['foo', 'bar', 'baz'])); 
+0

在我30秒前到達那裏。應該注意的是,這對於嵌套數組,fe' ['foo','bar',['baz','buzz']]'不起作用。雖然老實說,原來的轉換首先是不尋常的,如果你有嵌套的數組,應該重新考慮。 – iabw 2014-08-31 17:00:01

+0

@iabw:你從哪裏得到嵌套數組? OP沒有提及它們。 – Bergi 2014-08-31 17:05:51

+0

嵌套數組在非終端位置的含義尚不清楚。如果'['foo','bar',['baz','buzz'],'garb']',那麼'garb'去哪裏? – 2014-08-31 17:23:32