Estoy tratando de recrear la función indexOf en JavaScript. No puedo hacer que funcione la parte de retorno -1, pero las otras partes funcionan bien. Parece que el final de mi ciclo for no se está ejecutando, ya que intento imprimir "fin de ciclo". También tengo un código de prueba y los resultados a continuación. Cualquier ayuda sería apreciada.
Array.prototype.myIndexOf = function(...args) { if(args[1] === undefined){ for(let i = 0; i < this.length; i++){ if(this[i] === args[0]){ return i; } } } else { for(let i = args[1]; i < this.length; i++){ if(this[i] === args[0]){ return i; } } console.log("end of loop") return -1; } }; // TEST const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); console.log(beasts.myIndexOf('bison')); // expected output: 1 // start from index 2 console.log(beasts.indexOf('bison', 2)); console.log(beasts.myIndexOf('bison', 2)); // expected output: 4 console.log(beasts.indexOf('giraffe')); console.log(beasts.myIndexOf('giraffe')); // expected output: -1 1 1 4 4 -1 undefinedEstás cerca. Mover el return -1; instrucción fuera de los bloques if/else . Tal como está escrito actualmente, solo recibirá el -1 si no encuentra una coincidencia y pasó dos argumentos.
Array.prototype.myIndexOf = function(...args) { if(args[1] === undefined){ for(let i = 0; i < this.length; i++){ if(this[i] === args[0]){ return i; } } } else { for(let i = args[1]; i < this.length; i++){ if(this[i] === args[0]){ return i; } } } return -1; }; // TEST const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); console.log(beasts.myIndexOf('bison')); // expected output: 1 // start from index 2 console.log(beasts.indexOf('bison', 2)); console.log(beasts.myIndexOf('bison', 2)); // expected output: 4 console.log(beasts.indexOf('giraffe')); console.log(beasts.myIndexOf('giraffe')); // expected output: -1 Con este cambio, siempre presionarás return -1; si no hay ninguna coincidencia independientemente del número de parámetros pasados.
En el último caso de prueba, no está enviando un segundo argumento a la función, por lo que es la primera parte de if-else la que se ejecutará: la parte if . No hay return -1 en esa parte.