Создать многомерный объект javascript из значений в массиве, используя цикл jquery .each

Мне нужно создать объект JavaScript, используя значения, хранящиеся в массиве. Каждое значение должно быть новым ключом внутри предыдущего. Каков наилучший подход для достижения этой цели?

var option = ['level_1','level_2','level_3','level_4'];

$.each( option, function( key, value ) {
    // ....
});

// I'm trying to get this result
var result = {
    'level_1': {
        'level_2': {
            'level_3': {
                'level_4':{}
             }
        }
    }
}

4 ответа

Решение

Вы должны отслеживать, где поставить следующий ключ. Итак, создайте переменную и изначально установите ее result затем на каждом проходе по массиву перемещайтесь туда, куда указывает эта переменная.

var option = ['level_1','level_2','level_3','level_4'];
var result = {};
var nextKeyGoesHere = result;

option.forEach( function( value ) {
  nextKeyGoesHere[value] = {};
  nextKeyGoesHere = nextKeyGoesHere[value];
});

console.log(result);

Ты можешь использовать reduceRightдля этого используется синтаксис имени вычисляемого свойства ES6.

const option = ['level_1','level_2','level_3','level_4'];

const obj = option.reduceRight( (acc, lvl) => ({ [lvl]: acc }), {});

console.log(obj);

В традиционном синтаксисе функции это будет:

const obj = option.reduceRight(function (acc, lvl) {
    return { [lvl]: acc };
}, {});

Можешь использовать Array#reduce()

var option = ['level_1','level_2','level_3','level_4'];

var res = {};
option.reduce((o, key) => (o[key] = {} , o[key]), res)

console.log(res)

Вы можете использовать любой из других ответов, которые используют Array#reduce Однако, если вы хотите рекурсивную версию, вот она:

function _makeTree(arr, index, subtree){
   if(index < arr.length){
     subtree[arr[index]] = {};
     return _makeTree(arr, index+1, subtree[arr[index]])
   }
   else return;
}

function makeTree(arr){
 var tree = {};
 _makeTree(arr, 0, tree)
 return tree;
  
}

var arr = ['level_1','level_2','level_3','level_4'];

console.log(makeTree(arr));

Другие вопросы по тегам