recorrer objetos objeto lista elementos crear convertir buscar array agregar javascript arrays object

javascript - objetos - Cómo crear un objeto anidado dada una matriz de claves



recorrer array de objetos javascript (5)

Dado es una matriz como esta:

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

La salida debe ser:

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

Intenté esto:

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? }

¿Cómo puedo recordar la última parte y agregar el siguiente nivel?


El ajuste más simple sería reasignar o en cada iteración:

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);

Sin embargo, esta podría ser una forma más clara de hacerlo:

const level = ["a", "b", "x"]; const result = {}; level.reduce((accum, key) => { accum[key] = {}; return accum[key]; }, result); console.log(result);


Este, creo que es más fácil si lo escribes en un estilo funcional.

var level = ["a", "b", "x"]; var o = {}; level.reduce(function (obj, key) { o[key] = {}; return o[key]; }, o);


O con una función recursiva.

const level = ["a", "b", "x"]; const f = (i) => i === level.length ? {} : {[level[i]]: f(i+1)}; console.log(f(0));


Puede usar el método reduceRight pasando una función de arrow como argumento .

var level = ["a", "b", "x"]; let result = level.reduceRight((obj, elem) => ({[elem]: obj}), {}); console.log(result);


Puede usar una verificación si existe el nivel y asignar solo un objeto si no está configurado.

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);