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.

Obtener array de todos los ID de hijos y nietos a partir del ID del padre en TypeScript.

Supongamos que tengo un array de objetos que muestra datos jerárquicos:

const data = [
  { groupId: 1, parentGroupId: null },
  { groupId: 2, parentGroupId: 1 },
  { groupId: 3, parentGroupId: 1 },
  { groupId: 4, parentGroupId: null },
  { groupId: 5, parentGroupId: 99 },
  { groupId: 6, parentGroupId: 2 },
  { groupId: 7, parentGroupId: 6 },
  { groupId: 8, parentGroupId: 4 }];

¿Cómo se podría escribir una función recursiva de typescript que tomaría un parámetro parentGroupId y devolvería un array de groupId que incluye su propio groupId y los groupId de todos sus hijos, nietos, bisnietos y así sucesivamente de forma recursiva?

es decir, la función debería devolver:

[1,2,3,6,7]

Hasta ahora tengo una función que devuelve el padre y sus hijos, pero me falta la parte recursiva para incluir también los nietos, bisnietos y así sucesivamente.

 const data = [
          { groupId: 1, parentGroupId: null },
          { groupId: 2, parentGroupId: 1 },
          { groupId: 3, parentGroupId: 1 },
          { groupId: 4, parentGroupId: null },
          { groupId: 5, parentGroupId: 99 },
          { groupId: 6, parentGroupId: 2 },
          { groupId: 7, parentGroupId: 6 },
          { groupId: 8, parentGroupId: 4 }];

    function getChildIds(arr, parentGroupId) {
      return arr.reduce(function (ret, item) {
        if (item.parentGroupId == parentGroupId || item.groupId == parentGroupId) {
          ret = ret.concat(item.groupId);
        }
        return ret;
      }, []);
    }

    console.log(getChildIds(data, 1));
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar la parte recursiva a la función, podemos modificarla para comprobar si el parentGroupId del elemento actual coincide con el parámetro parentGroupId actual. Si coincide, agregamos el groupId del elemento al array de resultados y llamamos a la función de forma recursiva con el groupId del elemento como el nuevo parámetro parentGroupId. Esto continuará hasta que no haya más grupos secundarios que agregar. Aquí está la función modificada:

    function getChildIds(arr: any[], parentGroupId: any): any[] {
        return arr.reduce(function (ret, item) {
            if (item.parentGroupId == parentGroupId || item.groupId == parentGroupId) {
                ret.push(item.groupId);
                const childIds = getChildIds(arr, item.groupId);
                ret.push(...childIds);
            }
            return ret;
        }, []);
    }
    

    Observe que también hemos añadido .push (... childIds) para agregar la matriz de childIds al array de resultados en lugar de simplemente concatenarla con ret. Esto asegura que el array resultante está aplanado y no contiene ninguna matriz anidada.

    Ahora, si llamamos a getChildIds(data, 1), obtendremos el resultado esperado [1, 2, 3, 6, 7].

Comments are closed.