Quiero escribir una función que pase una matriz y un número opcional de valores para eliminarlos de la matriz como parámetros. Mi función funciona cuando solo hay 1 valor, pero falla cuando hay varios valores.
const removeFromArray = function (arr, ...theArgs) { for (let i = 0; i < arr.length; i++) { if (theArgs.includes(arr[i])) { arr.splice(i, 1); } } return arr; };Puedes usar el método de filter para eso:
const removeFromArray = function (arr, ...theArgs) { return arr.filter( val => !theArgs.includes(val) ) }; const list = [1,2,3]; const newList = removeFromArray(list, 2,3); console.log(newList);Y una versión más concisa:
const removeFromArray = (arr, ...args)=> arr.filter( val => !args.includes(val) )Sugerencia: intente evitar la mutación de la matriz original y trabaje o devuelva una copia durante estas operaciones.
El problema es con su indexación, está encontrando el elemento usando el índice de arr y eliminándolo en la matriz, lo que probablemente esté causando problemas con la indexación en bucle. Modifica tu código de la siguiente manera
const removeFromArray = function (arr, ...theArgs) { for (let i = 0; i < theArgs.length; i++) { if (arr.includes(theArgs[i])) { arr.splice(arr.indexOf(theArgs[i]), 1); } } return arr; };Lo anterior corrige el código a tu manera, pero una mejor manera de hacerlo sería usando el filtro.
const removeFromArray = function (arr, ...theArgs) { return arr.filter(ele => !theArgs.includes(ele)) }Lo escribo de esta manera para mantener puramente su función.
El problema se debe a que elimina el elemento de la matriz mientras realiza un bucle desde esa matriz.
Cada vez que su bucle for itere la matriz, obtendrá una nueva matriz
por ejemplo (1,2,3,4,5 => 2,3,4,5), pero el valor i sigue aumentando en 1.
const removeFromArray = function (arr, ...theArgs) { for (let i = 0; i < arr.length; i++) { console.log(`arr:${arr}`,`item${arr[i]}`,`num${i}`) console.log(arr[i]) if (theArgs.includes(arr[i])) { arr.splice(i, 1); } } return arr; }; const testarray = [1,2,3,4,5] console.log(removeFromArray(testarray,1,2,3))