2014-08-31 5 views
0

Как преобразовать простой массив как это: ['foo', 'bar', 'baz'] к объекту, как это:Преобразовать массив объекта включительно

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

Это кажется настолько простым, но я не могу понять это.

+2

Что вы пробовали? Покажите нам свою попытку. Это действительно должна быть простая рекурсивная функция или обратный цикл. – Bergi

ответ

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

+0

@iabw: Откуда вы взяли вложенные массивы? ОП не упоминает их. – Bergi

+0

Значение вложенных массивов в отличном от конечного положения неясно. Если '['foo', 'bar', ['baz', 'buzz'], 'garb']', то где же 'garb' go? – 2014-08-31 17:23:32

Смежные вопросы