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