Как преобразовать простой массив как это: ['foo', 'bar', 'baz']
к объекту, как это:Преобразовать массив объекта включительно
{ 'foo': {
'bar': {
'baz' : {}
}
}
}
Это кажется настолько простым, но я не могу понять это.
Как преобразовать простой массив как это: ['foo', 'bar', 'baz']
к объекту, как это:Преобразовать массив объекта включительно
{ 'foo': {
'bar': {
'baz' : {}
}
}
}
Это кажется настолько простым, но я не могу понять это.
Вы должны использовать 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: { } } }
Я думаю, что это то, что вы хотите:
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']));
Получил 30 секунд передо мной. Следует, наверное, отметить, что это не будет работать для вложенных массивов, fe '['foo', 'bar', ['baz', 'buzz']]'. Хотя, честно говоря, первоначальное преобразование является, в первую очередь, необычным, и если у вас есть вложенные массивы, возможно, следует пересмотреть. – iabw
@iabw: Откуда вы взяли вложенные массивы? ОП не упоминает их. – Bergi
Значение вложенных массивов в отличном от конечного положения неясно. Если '['foo', 'bar', ['baz', 'buzz'], 'garb']', то где же 'garb' go? – 2014-08-31 17:23:32
Что вы пробовали? Покажите нам свою попытку. Это действительно должна быть простая рекурсивная функция или обратный цикл. – Bergi