Estoy escribiendo una función que toma como primer argumento una matriz ( arr1 ) y luego N cantidad de argumentos ( arr2 ), por lo que elimina los N argumentos ( arr2 ) de la matriz ( arr1 ). La función parece estar haciendo el trabajo, excepto que se detiene inmediatamente cuando la declaración if se vuelve verdadera. Lo sé porque si elimino la instrucción if, los bucles se iteran hasta el final. ¿Alguna idea de lo que hice mal?
Entonces, debajo de la matriz devuelta debería estar ['A', 'B', 'E'].
const removeFromArray = function(arr1, arr2) { let arr_new = arr1; first_loop: for (const [y, elem] of arr1.entries()) { for (let i=1; i<arguments.length; i++) { if ((elem === arguments[i])) { arr_new.splice(y); } } } return arr_new; } alert(removeFromArray(['A', 'B', 'C', 'D','E'],'C','D'));splice modifique la matriz original para que cuando la llame. Simplemente elimina todos los elementos de y hasta el final de arr_new y arr_new se refiere a arr1 .
const foo = [1, 2, 3, 4]; foo.splice(2); console.log(foo); // [1, 2] arr1.entries() es un iterador que continúa rastreando arr1 internamente, por lo que cuando modifica arr1 también modificará entries , por lo que su ciclo se detiene: no hay elementos después del empalme
Para solucionar este problema, puede modificar su código
if ((elem === arguments[i])) { arr_new.splice(y, /*👉 remove only one element*/1); }⚠️ La solución Ps anterior todavía tiene problemas con los índices porque modifica la matriz original y retransmite en ese índice. Esto conduce a un resultado general incorrecto.
Esta es la solución adecuada para eliminar de la matriz, sin modificaciones y con una mejor complejidad O (n)
const removeFromArray = function(arr1, ...arr2) { const exclude = arr2.reduce((acc, curr) => { acc.add(curr); return acc; }, new Set()); return arr1.filter((it) => { return !exclude.has(it) }); }Aquí hay una versión alternativa de lo que está tratando de lograr. Si bien las funciones de flecha no tienen arguments , aún puede emularlas a través de rest parameters . Entonces puedes usar un filtro
const removeFromArray = (...args) => { let arr1 = args[0], arr2 = args.slice(1) return arr1.filter(a => arr2.indexOf(a) === -1) } console.log(removeFromArray(['A', 'B', 'C', 'D', 'E'], 'C', 'D'));