es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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'
    }
  }
}}
Tags:  , , , ,

Answer

  1. Avatar for 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:

    let array = [];
    
    const encontrarClaves = (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 ++;
    
        // agregar caso base para detener la recursión al alcanzar un objeto no anidado
        if(typeof ob[keys[i]] === 'object') {
          encontrarClaves(ob[keys[i]]);
        }
      }
    
      return array;
    };
    

    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:

    const data = {a: {
      b: {
        c: {
          foo: 'bar'
        }
      }
    }}
    
    let nuevoArray = encontrarClaves(data);
    console.log(nuevoArray);
    

    Esto mostrará un array de tres objetos con ids y etiquetas para cada clave:

    [
      { id: 0, label: 'a' },
      { id: 1, label: 'b' },
      { id: 2, label: 'c' },
      { id: 3, label: 'foo' }
    ]
    

    Ahora tenemos un array de objetos con todas las claves del objeto anidado.

Comments are closed.