Как создать вложенный объект по массиву ключей - PullRequest
0 голосов
/ 11 мая 2018

Данный массив выглядит так:

var level = ["a", "b", "x"];

Вывод должен быть:

{
    "a": {
        "b": {
            "x": {
            }
        }
    }
}

Я пробовал это:

var level = ["a", "b", "x"];
var o = {};
for (var c = 0, len = level.length; c < len; c +=1 ) { 
    var part = level[c]; 
    o[part] = {}; // how to remember the last part?
}

Как я могу вспомнитьпоследняя часть и добавить следующий уровень?

Ответы [ 5 ]

0 голосов
/ 27 мая 2018

Или с рекурсивной функцией

const level = ["a", "b", "x"];
const f = (i) => i === level.length ? {} : {[level[i]]: f(i+1)};
console.log(f(0));
0 голосов
/ 11 мая 2018

Вы можете использовать reduRight метод, передав функцию arrow в качестве аргумента .

var level = ["a", "b", "x"];
let result = level.reduceRight((obj, elem) => ({[elem]: obj}), {});
console.log(result);
0 голосов
/ 11 мая 2018

Этот, я думаю, будет проще, если вы напишите его в функциональном стиле.

var level = ["a", "b", "x"];
var o = {};
level.reduce(function (obj, key) {
    o[key] = {};
    return o[key];
}, o);
0 голосов
/ 11 мая 2018

Вы можете использовать проверку, если уровень существует, и назначить только объект, если он не установлен.

function addLevels(levels, object) {
    levels.reduce((o, l) => o[l] = o[l] || {}, object);
}

var object = {};

addLevels(["a", "b", "x"], object);
addLevels(["a", "d", "z"], object);

console.log(object);
0 голосов
/ 11 мая 2018

Простейшей настройкой было бы переназначить o на каждой итерации:

var level = ["a", "b", "x"];
var o = {};
var initialO = o;
for (var c = 0, len = level.length; c < len; c +=1 ) { 
  var part = level[c];
  o[part] = {};
  o = o[part];
}
console.log(initialO);

Это может быть более ясный способ сделать это, хотя:

const level = ["a", "b", "x"];
const result = {};
level.reduce((accum, key) => {
  accum[key] = {};
  return accum[key];
}, result);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...