Como ya pregunté, me gustaría volver a preguntar porque quería un método mutable, no un método inmutable.
Quiero comparar las dos matrices a continuación para eliminar los elementos duplicados.
Después de eliminar los elementos duplicados, quiero eliminarlos de la matriz de suelo existente , en lugar de crear una nueva matriz.
Me acerqué de esta manera, pero no parece funcionar correctamente.
const filtered = ground.filter((row, idx) => { if (row.join() === deleteBlock.join()) { return ground.splice(idx, 1); } }); let ground = [ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [4,3,2,3,4,5,6,7,8,6,5,5,3,2,3], [2,2,2,2,2,2,2,2,2,3,3,3,3,4,5], [3,3,7,7,7,7,8,8,4,4,4,2,2,3,7] ] let deleteBlock = [ [4,3,2,3,4,5,6,7,8,6,5,5,3,2,3], [2,2,2,2,2,2,2,2,2,3,3,3,3,4,5], [3,3,7,7,7,7,8,8,4,4,4,2,2,3,7] ]Entonces, un problema es que cuando empalma la matriz de tierra, está eliminando el elemento y luego el método .forEach salta ADELANTE al siguiente elemento y ahora se ha saltado un elemento. Si usa un bucle for tradicional, puede cambiar el bucle for hacia atrás cada vez que elimine un elemento para no omitir ninguno.
Además, parece que está comparando todo deleteBlock con cada fila de suelo en lugar de comparar cada fila de deleteBlock con cada fila de ground . Así que agregué un forEach adicional dentro de cada iteración del bucle for.
for(let x=0;x<ground.length;x++){ deleteBlock.forEach((dBlock)=>{ //check each row to each row if (ground[x].join() === dBlock.join()) { console.log(dBlock) ground.splice(x, 1); //after removing an item shift the for loop back one to avoid skipping x-- } }) } /* * There are many ways to reach this solution * This is my bet */ let ground = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,4,3,2,3,4,5,6,7,8,6,5,5,3,2,3,1], [1,2,2,2,2,2,2,2,2,2,3,3,3,3,4,5,1], [1,3,3,7,7,7,7,8,8,4,4,4,2,2,3,7,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], ] let deleteBlock = [ [1,4,3,2,3,4,5,6,7,8,6,5,5,3,2,3,1], [1,2,2,2,2,2,2,2,2,2,3,3,3,3,4,5,1], [1,3,3,7,7,7,7,8,8,4,4,4,2,2,3,7,1] ]; /* * I prefer use JSON.stringify to be more confident then using Array.join() deleteBlock = deleteBlock.map(m=>JSON.stringify(m)); newGround = ground.filter(item=>(!deleteBlock.includes(JSON.stringify(item)))); console.log(newGround); */ /* * No Array Copy * for this, you need to pass to Array.splice() the length of the deleteBlock */ deleteBlock = deleteBlock.map(m=>JSON.stringify(m)); ground.forEach((item,i)=>deleteBlock.includes(JSON.stringify(item)) ? ground.splice(i,deleteBlock.length) : null); console.log(ground);