Tengo una función recursiva para trabajar con matrices anidadas que tienen varios niveles de profundidad. Se supone que el siguiente código selecciona elementos aleatorios, uno de cada nivel, y los combina en una matriz (en el orden en que se imprimen en la consola). Sin embargo, la matriz resultante solo contiene elementos de los niveles más altos (A, B o C, D o C), nada por debajo de eso. ¿Cuál es la razón para eso?
const arry = [ ["A"], ["B", "C"], ["D", "E"], [ [ ["F1", "F2"], ["G1", "G2"], [ "H1", "H2", [ ["I1", "I2", "I3"], ["J1", "J2"], ["K1", "K2", "K3"], ], ], ], ], ]; function rndmElementSelection(array) { rndElm = array[Math.floor(Math.random() * array.length)]; return rndElm; } function recursion(array, resultAry = []) { array.forEach((element) => { if (typeof element === "string") { console.log(element); resultAry.push(element); } else { nE = rndmElementSelection(element); if (typeof nE === "string") { console.log(nE); resultAry.push(nE); } else { recursion(nE); } } }); return resultAry; } console.log(recursion(arry));El problema es que su llamada recursiva no pasa el segundo argumento.
Sin pasarlo, cada llamada recursiva solo llenará su propia matriz nueva. Devuelve esa matriz a la persona que llama, pero la persona que llama (haciendo la llamada recursiva) ignora ese valor devuelto, por lo que todo el trabajo de la llamada recursiva es en vano.
Así que la solución fácil es cambiar esto:
} else { recursion(nE);a esto:
} else { recursion(nE, resultAry);Prueba esto:
function recursion(array, resultAry = []) { array.forEach((element) => { if (typeof element === "string") { console.log(element); resultAry.push(element); } else { nE = rndmElementSelection(element); if (typeof nE === "string") { console.log(nE); resultAry.push(nE); } else { resultAry = [...resultAry, ...recursion(nE)]; } } }); return resultAry; }