Me gustaría crear una función que devuelva una matriz de funciones. Cuando se llama a cualquier función de la matriz, el resultado debe ser el índice de esta función en la matriz. La tarea y el desafío son crear esta función sin bucles for. Me estaba moviendo de esta manera, sin embargo, el código no funcionó como esperaba:
const createArrayOfFunctions = number => { const functionsArray = new Array(number).fill(); return functionsArray.map(element => function() { return functionsArray.indexOf(element); }); };Esperaba:
const testArray = createArrayOfFunctions(7); testArray[2](); // 2;¿Hay alguna forma de lograr el objetivo sin usar for-loops? Lo necesito para un proyecto de estudio.
Primero, usa new Array(number).fill() , que crea una matriz de undefined . Entonces, cuando llamas a testArray(2)() , tu element dentro de tu función de retorno también está undefined . luego trató de encontrar el índice de undefined , devuelve 0. La razón por la que devuelve 0 es porque su functionsArray es una matriz de 7 undefined en su caso, entonces Array.indexOf devolverá la primera coincidencia, y dado que functionArray[0] es undefined , es por eso que siempre devuelve 0 sin importar a qué función llame dentro de su functionArray . ¿Tener sentido?
Hice un pequeño cambio en tu código, prueba esto. Debería funcionar como cabría esperar. No Array.indexOf ni ningún otro método de matriz solo porque solo desea el índice, ¿por qué no considerar usar el índice en su lugar?
Si insiste en que quiere usar Array.indexOf para resolver su problema, tendrá que usar un forloop dentro de createArrayOfFunctions para crear su functionsArray con diferentes elementos (por ejemplo, 0,1,2,3,4...7), porque new Array(number).fill() crea una matriz de undefined , e incluso si hace Array(number).fill(number) , solo crea una matriz de 7 en su caso, por lo que es exactamente lo mismo que un matriz de 7 undefined en su caso. Así que tu método no funcionará. Como mencionó que no hay forloop, es por eso que proporcioné el método usando el índice como se describe anteriormente.
También le recomendaría agregar algo de lógica o crear una función separada para asegurarse de que nadie pueda llamar a testArray fuera de límite, por ejemplo, si crea 7 funciones de matriz, no quiere que las personas puedan llamar a testArray[8] . Espero que esto ayude. déjame saber si tienes alguna confusión.
const createArrayOfFunctions = (number) => { functionsArray = new Array(number).fill(0); return functionsArray.map((element, index) => { return () => { return index; }; }); }; const testArray = createArrayOfFunctions(7); console.log(testArray[2]()); // 2; console.log(testArray[3]()); // 2; console.log(testArray[1]()); // 2;Puedes lograr tu objetivo usando Array.from así:
const createArrayOfFunctions = length => Array.from({length}, (v, i)=> ()=> i); const arrayOfFunctions = createArrayOfFunctions(10); console.log(arrayOfFunctions[0]()) console.log(arrayOfFunctions[9]()) // last item would be 9En primer lugar, le sugiero que cambie new Array().fill() a solo [] .
Podemos recrear un bucle for usando un bucle while.
let x = 0 while (x < 5) { console.log(`five times`) x++ }Por lo tanto, te sugiero que hagas esto:
function createarray() { let arrayfunc = [] let i = 0 while(i<10) {arrayfunc.push(new Function('console.log(\' + i + \')\'))} return arrayfunc }