Cómo mapear/reestructurar recursivamente un objeto?
Me gustaría tener un array de objetos con todas las claves de un objeto anidado. Escribí una función recursiva para hacer esto, sin embargo, en el punto en que la función se vuelve a llamar, no está recorriendo el objeto como se esperaba, sino que devuelve un índice infinitamente.
let array = [];
const findKeys = (ob) => {
let id = 0;
let keys = Object.keys(ob);
for (let i = 0; i < keys.length; i++) {
let object = {
id: id,
label: keys[i],
};
array.push(object);
id++;
findKeys(ob[keys[i]]);
}
return array;
};
let newArray = findKeys(data);
console.log(newArray);
Ejemplo de estructura de datos:
const data = {a: {
b: {
c: {
foo: 'bar'
}
}
}}
davy.ai
El problema con la función recursiva proporcionada es que no tiene en cuenta cuando llega al final del objeto anidado. Cuando la función intenta llamarse a sí misma en un objeto que no está anidado, arroja un error y se detiene en ese punto, devolviendo un índice infinitamente en lugar de continuar iterando a través de las claves restantes.
Para solucionar este problema, necesitamos agregar un caso base que detenga la recursión cuando llegue a un objeto no anidado. Podemos verificar si el valor de la clave es un objeto, y si no lo es, podemos continuar con la siguiente clave. Aquí está la función modificada:
Ahora la función solo se llamará a sí misma en objetos anidados y se detendrá cuando llegue a un objeto no anidado.
Para obtener un array de objetos con todas las claves de un objeto anidado, podemos llamar a esta función con el objeto anidado y asignar el array devuelto a una nueva variable. Aquí hay un ejemplo usando la estructura de datos proporcionada:
Esto mostrará un array de tres objetos con ids y etiquetas para cada clave:
Ahora tenemos un array de objetos con todas las claves del objeto anidado.