Estoy tratando de eliminar un elemento de una matriz en un forEach
bucle, pero tengo problemas con las soluciones estándar que he visto.
Esto es lo que estoy intentando actualmente:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Sé que está entrando if
porque lo veo YippeeeeeE!!!!!!!!!!!!!
en la consola.
MI PROBLEMA: Sé que mi bucle for y si la lógica son correctos, pero mi intento de eliminar el elemento actual de la matriz está fallando.
ACTUALIZAR:
Probé la respuesta de Xotic750, y el elemento aún no se elimina:
Aquí está la función en mi código:
review.forEach(function (item, index, object) {
if (item === '\u2022 \u2022 \u2022') {
console.log('YippeeeE!!!!!!!!!!!!!!!!')
object.splice(index, 1);
}
console.log('[' + item + ']');
});
Aquí está la salida donde la matriz aún no se elimina:
[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]
Entonces, obviamente, va a entrar en la declaración if como se indica, pero también es obvio que el [• • •] todavía está allí.
javascript
foreach
novatoPrgrmr
fuente
fuente
forEach
? Si desea eliminar elementos, la función más adecuada esfilter
.index
atributo en lugar deitem
para susplice
Respuestas:
¿Parece que estás intentando hacer esto?
Itere y mute una matriz usando Array.prototype.splice
Lo que funciona bien para un caso simple en el que no tiene 2 de los mismos valores que los elementos de la matriz adyacente, de lo contrario, tiene este problema.
Entonces, ¿qué podemos hacer con este problema al iterar y mutar una matriz? Bueno, la solución habitual es trabajar a la inversa. Usando ES3 mientras, pero puede usarlo para azúcar si lo prefiere
Ok, pero querías usar métodos de iteración de ES5. Bueno, una opción sería usar Array.prototype.filter, pero esto no muta la matriz original sino que crea una nueva, por lo que, si bien puede obtener la respuesta correcta, no es lo que parece haber especificado.
También podríamos usar ES5 Array.prototype.reduceRight , no por su propiedad reductora sino por su propiedad de iteración, es decir, iterar en reversa.
O podríamos usar ES5 Array.protoype.indexOf así.
Pero específicamente desea utilizar ES5 Array.prototype.forEach , entonces, ¿qué podemos hacer? Bueno, necesitamos usar Array.prototype.slice para hacer una copia superficial de la matriz y Array.prototype.reverse para que podamos trabajar a la inversa para mutar la matriz original.
Por último, ES6 nos ofrece algunas alternativas más, donde no necesitamos hacer copias superficiales y revertirlas. Cabe destacar que podemos utilizar generadores e iteradores . Sin embargo, el apoyo es bastante bajo en la actualidad.
Algo a tener en cuenta en todo lo anterior es que, si estuviera quitando NaN de la matriz, comparar con iguales no funcionará porque en Javascript
NaN === NaN
es falso. Pero vamos a ignorar eso en las soluciones, ya que es otro caso límite no especificado.Así que ahí lo tenemos, una respuesta más completa con soluciones que todavía tienen casos extremos. El primer ejemplo de código sigue siendo correcto, pero como se indicó, no está exento de problemas.
fuente
console.log(review);
después deforEach
, como en mi ejemplo.Usar en
Array.prototype.filter
lugar deforEach
:fuente
Aunque la respuesta de Xotic750 proporciona varios puntos buenos y posibles soluciones, a veces lo simple es mejor .
Usted sabe que la matriz en la que se está iterando se está mutando en la iteración en sí (es decir, eliminando un elemento => cambios de índice), por lo que la lógica más simple es retroceder en un lenguaje anticuado
for
(a la C ):Si realmente lo piensas, a
forEach
es simplemente azúcar sintáctico para unfor
bucle ... Entonces, si no te está ayudando, simplemente deja de romperte la cabeza contra él.fuente
También puede usar indexOf en su lugar para hacer esto
fuente
Entendí que desea eliminar de la matriz usando una condición y tener otra matriz que tenga elementos eliminados de la matriz. ¿Es correcto?
¿Qué tal esto?
Espero que esto ayude...
Por cierto, comparé 'for-loop' con 'forEach'.
Si se elimina en caso de que una cadena contenga 'f', el resultado es diferente.
Y eliminar por cada iteración, también un resultado es diferente.
fuente
¡Lo siguiente le dará todos los elementos que no son iguales a sus caracteres especiales!
fuente
Así es como debe hacerlo:
fuente
if
declaración.item, index, object