La función destroyer (matriz1, algunos argumentos) debe devolver la matriz1 excluyendo los argumentos. Encontré algunas formas de trabajo como return arr = arr.filter(val => !rem.includes(val)); pero necesito arreglar este código y averiguar por qué este código da un resultado incorrecto. Se suponía que era [1]
function destroyer(arr, ...rem) { for(let i = 0; i < arr.length; i++) { if (rem.includes(arr[i])) { arr.splice(i, 1); }; }; return arr; } console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5)); function destroyer(arr, ...rem) { const itemsToRemove = new Set(rem); return arr.reduce((acc, curr) => itemsToRemove.has(curr) ? acc : [...acc, curr] ,[]) } console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5));O puedes hacerlo así:
const destroyer=(arr, ...rem)=>arr.filter(v=>!rem.includes(v)); console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5));El problema es la llamada de la función Array.prototype.splice dentro del bucle for, esta función está mutando el arreglo y básicamente afecta los índices del arreglo, por lo tanto el índice actual i ya no es válido.
Para evitar esto, puede realizar un bucle hacia atrás, de esta manera podemos mutar la matriz y el índice actual no se ve afectado.
Una cosa más, su enfoque es mutar la matriz, un mejor enfoque sería usar la función Array.prototype.filter junto con la función Array.prototype.includes , vea otras respuestas.
function destroyer(arr, ...rem) { for(let i = arr.length; i >= 0; i--) { if (rem.includes(arr[i])) { arr.splice(i, 1); }; }; return arr; } console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5));