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 utilizar correctamente la recursión con datos Json y estructurarla.

Estoy trabajando en un código que obtiene datos Json de un servidor mssql en una aplicación de node.
El escenario es:
1. Obtengo una lista de gerentes en la primera llamada a la API basada en el nombre de usuario del gerente principal, cada gerente tiene un nombre de usuario.
2. Basado en ese nombre de usuario, ejecuto una función recursiva para iterar a través de la base de datos y obtener a sus sub-gerentes, y así sucesivamente.

Objetivo final: Devolver los datos colectivos en una respuesta JSON
Mi resultado deseado debería ser:

{
   Username: "Nombre de usuario del gerente principal",
   children: [
      {
         Username: "Nombre de usuario del gerente",
         children: [
            {
               Username: "Nombre de usuario del sub-gerente",
               children: []
            }
         ]
      }
   ]
}

Mi código:

function getTreeData(dataset, newObj = {}) {
   return dataset.map(async (employee, index) => {
      let query = `SELECT [Username], [First Name], [Last Name] FROM TBL_M_FACT_EMPLOYEE_CENTRAL_ACTIVE WHERE [Reporting Manager User Sys ID] = '${employee.Username}'`;

      let data = await config.sequelize.query(query, {
         type: config.sequelize.QueryTypes.SELECT,
      });

      newObj = { ...newObj, data }

      console.log("------------------------------------");
      console.log(query);
      // console.log(data);
      console.log(newObj)
      console.log("------------------------------------");

      if (data.length === 0) {
         return newObj
      } else {
         getTreeData(data);
      }
   });
}

authRouter.get("/getEmployeeData", async (req, res, next) => {
   try {
      console.log("Inicio");
      let sqlQuery = `SELECT [Username], [First Name], [Last Name] FROM TBL_M_FACT_EMPLOYEE_CENTRAL_ACTIVE WHERE [Reporting Manager User Sys ID] = 'T502217'`;
      let result = await config.sequelize.query(sqlQuery, {
         type: config.sequelize.QueryTypes.SELECT,
      });

      console.log("Inicio del bucle finalmente");

      getTreeData(result);

      res.status(200).json({
         username: "T502217",
         chilren: result,
      });
   } catch (error) {
      console.log(error);
   }
});
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Explicación del código

    Estoy creando una función getTreeData que acepta dataset como parámetro, el cual consiste en la lista de gerentes obtenida de la primera llamada a la API basada en el nombre de usuario del gerente principal. La función también acepta newObj, que es un objeto vacío al principio y contendrá los datos finales.

    • Dentro de la función, estoy mapeando el dataset para iterar a través de cada gerente y obtener sus subgerentes basados en su nombre de usuario utilizando una consulta SQL que obtiene datos del servidor SQL. Los datos obtenidos se almacenan en la variable data. Luego, se aplica el operador de expansión (spread) de newObj utilizando los datos para almacenar una respuesta colectiva.
    • Si la longitud de data es cero, la función devuelve newObj. Si no es cero, la función getTreeData se llama a sí misma nuevamente para obtener los subgerentes del gerente actual.

    • En la ruta authRouter.get, estoy usando un bloque try y catch para manejar cualquier error que pueda ocurrir al ejecutar la consulta SQL.

    • Estoy obteniendo datos mediante la consulta SQL que obtiene todos los empleados con el ID de Sistema de Usuario del Gerente de Informes como “T502217”, donde “T502217” es el nombre de usuario del gerente principal.

    • Luego llamo a la función getTreeData con los datos obtenidos como parámetro.

    • Luego envío la respuesta que contiene username como “T502217” y children que contiene el resultado de la consulta SQL, que consiste en la lista de todos los subgerentes.

    Salida deseada

    La salida deseada es un objeto JSON que contiene el Username del gerente principal y un arreglo de children que contiene un objeto para cada gerente con su Username y un arreglo de children si tienen algún subgerente. La estructura de la salida debería ser la siguiente:

    {
    Username:"Username del gerente principal",
    children:[
       {
        Username:"Username del gerente",
        children:[{
         {
           Username:"Username del subgerente",
           children:[]}
       }]
    .
    .
    .
    }
    ]
    }
    

Comments are closed.