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));
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:
Observe que también hemos añadido
.push (... childIds)
para agregar la matriz de childIds al array de resultados en lugar de simplemente concatenarla conret
. 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]
.