Estoy intentando resolver este problema de forma recursiva: Clean the room function: given an input of [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20], make a function that organizes these into individual array that is ordered. For example answer(ArrayFromAbove) should return: [[1,1,1,1],[2,2,2], 4,5,10,[20,20], 391, 392,591]
Array: const array1 = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20]; array1.sort((a,b) => ab);Función principal:
const sortArray = (mainArr) => { let acc = []; console.log(acc, "acc"); const recursive = (arr) => { if (arr.length > 1) { console.log("inside func2 ", acc); let likeArr = singArr(arr, arr[0]); console.log(likeArr, "like"); arr = deleteVal(arr, arr[0]); acc.push(likeArr); return recursive(mainArr); } else { return acc; } } };Funciones auxiliares:
const singArr = (arr1, val) => { let returnVal = arr1.filter(num => num === val); return (returnVal.length === 1 ? returnVal[0] : returnVal); }; const deleteVal = (arr, val) => { let returnVal = arr.filter(num => num !== val); return returnVal };La idea es revisar la matriz que he ordenado, filtrar usando el primer elemento de la matriz para obtener una nueva matriz (valor único si solo hay uno) con los elementos similares, empujarlo a mi acumulador y luego eliminar cada instancia de él en la matriz original.
Estoy tratando de hacer esto de forma recursiva hasta que no queden elementos en la matriz original, pero vuelve indefinido.
¿Alguna idea de dónde me estoy equivocando?
dentro de su función recursiva está haciendo return recursive(mainArr); en su lugar, intente devolver recursive(arr);
Nunca llamas a la función recursive .
const sortArray = (mainArr) => { let acc = []; console.log(acc, "acc"); const recursive = (arr) => { if (arr.length > 1) { console.log("inside func2 ", acc); let likeArr = singArr(arr, arr[0]); console.log(likeArr, "like"); arr = deleteVal(arr, arr[0]); acc.push(likeArr); return recursive(mainArr); } else { return acc; } } recursive(mainArr) //<--- Call it! }; También notará que sortArray no devuelve nada, por lo que es posible que desee cambiar recursive(mainArr) para return recursive(mainArr) para obtener un retorno.
Cabe destacar que el código no produce el resultado deseado, pero esta solución debería ayudarlo a comenzar.
No estás llamando a la función recursive desde fuera de la función.
const sortArray = (mainArr) => { let acc = []; console.log(acc, "acc"); const recursive = (arr) => { if (arr.length > 1) { console.log("inside func2 ", acc); let likeArr = singArr(arr, arr[0]); console.log(likeArr, "like"); arr = deleteVal(arr, arr[0]); acc.push(likeArr); return recursive(mainArr); } else { return acc; } } return recursive(mainArr) };Además, creo que el código publicado no devuelve el resultado deseado. Probablemente puedas hacer lo siguiente:
const array1 = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20]; array1.sort((a,b) => ab); const map = new Map(); array1.forEach((item) => { if(map.has(item)) { const storedItem = map.get(item); map.set(item, Array.isArray(storedItem) ? [...storedItem, item] : [storedItem, item]) } else { map.set(item, item); } }); console.log(Array.from(map.values()))