remove item index from array and javascript foreach splice

javascript - and - remove item from array jquery by index



¿Cómo eliminar element from array en forEach loop? (6)

¡Lo siguiente le dará todos los elementos que no son iguales a sus personajes especiales!

review = jQuery.grep( review, function ( value ) { return ( value !== ''/u2022 /u2022 /u2022'' ); } );

Estoy tratando de eliminar un elemento en una matriz en un bucle forEach , pero estoy teniendo problemas con las soluciones estándar que he visto.

Esto es lo que estoy intentando en este momento:

review.forEach(function(p){ if(p === ''/u2022 /u2022 /u2022''){ console.log(''YippeeeE!!!!!!!!!!!!!!!!'') review.splice(p, 1); } });

Sé que está entrando en el if porque estoy viendo YippeeeeeE!!!!!!!!!!!!! en la consola

MI PROBLEMA: Sé que mi bucle for y si la lógica son sólidos, 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á el resultado donde la matriz aún no se elimina:

[Scott McNeil] [reviewed 4 months ago] [ Mitsubishi is AMAZING!!!] YippeeeE!!!!!!!!!!!!!!!! [• • •]

Así que, obviamente, está entrando en la declaración if tal como se indica, pero también es obvio que el [• • •] todavía está allí.


Aquí es cómo debes hacerlo:

review.forEach(function(p,index,object){ if(review[index] === ''/u2022 /u2022 /u2022''){ console.log(''YippeeeE!!!!!!!!!!!!!!!!'') review.splice(index, 1); } });


Entendí que desea eliminar de la matriz mediante una condición y tener otra matriz que tiene elementos eliminados de la matriz. ¿Es correcto?

¿Qué tal esto?

var review = [''a'', ''b'', ''c'', ''ab'', ''bc'']; var filtered = []; for(var i=0; i < review.length;) { if(review[i].charAt(0) == ''a'') { filtered.push(review.splice(i,1)[0]); }else{ i++; } } console.log("review", review); console.log("filtered", filtered);

Espero que esto ayude...

Por cierto, comparé ''for-loop'' con ''forEach''.

Si lo elimina en caso de que una cadena contenga ''f'', el resultado es diferente.

var review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"]; var filtered = []; for(var i=0; i < review.length;) { if( review[i].includes(''f'')) { filtered.push(review.splice(i,1)[0]); }else { i++; } } console.log("review", review); console.log("filtered", filtered); /** * review [ "concat", "copyWithin", "entries", "every", "includes", "join", "keys", "map", "pop", "push", "reduce", "reduceRight", "reverse", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "values"] */ console.log("========================================================"); review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"]; filtered = []; review.forEach(function(item,i, object) { if( item.includes(''f'')) { filtered.push(object.splice(i,1)[0]); } }); console.log("-----------------------------------------"); console.log("review", review); console.log("filtered", filtered); /** * review [ "concat", "copyWithin", "entries", "every", "filter", "findIndex", "flatten", "includes", "join", "keys", "map", "pop", "push", "reduce", "reduceRight", "reverse", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "values"] */

Y eliminar por cada iteración, también un resultado es diferente.

var review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"]; var filtered = []; for(var i=0; i < review.length;) { filtered.push(review.splice(i,1)[0]); } console.log("review", review); console.log("filtered", filtered); console.log("========================================================"); review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"]; filtered = []; review.forEach(function(item,i, object) { filtered.push(object.splice(i,1)[0]); }); console.log("-----------------------------------------"); console.log("review", review); console.log("filtered", filtered);


Parece que estás tratando de hacer esto?

Iterar y mutar una matriz usando Array.prototype.splice

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''b'', ''c'', ''b'', ''a'']; review.forEach(function(item, index, object) { if (item === ''a'') { object.splice(index, 1); } }); log(review);

<pre id="out"></pre>

Lo cual funciona bien para un caso simple en el que no tiene 2 de los mismos valores que los elementos de matriz adyacentes, de otro modo tiene este problema.

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''a'', ''b'', ''c'', ''b'', ''a'', ''a'']; review.forEach(function(item, index, object) { if (item === ''a'') { object.splice(index, 1); } }); log(review);

<pre id="out"></pre>

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 Array.prototype.splice puedes usarlo Array.prototype.splice azúcar si prefieres

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'' ,''a'', ''b'', ''c'', ''b'', ''a'', ''a''], index = review.length - 1; while (index >= 0) { if (review[index] === ''a'') { review.splice(index, 1); } index -= 1; } log(review);

<pre id="out"></pre>

Ok, pero querías que quisieras usar los métodos de iteración ES5. Bien y la opción sería usar Array.prototype.splice pero esto no muta la matriz original, sino que crea una nueva, por lo que aunque pueda obtener la respuesta correcta, no es lo que parece haber especificado.

También podríamos usar ES5 Array.prototype.splice , no por su propiedad de reducción más bien por su propiedad de iteración, es decir, iterar en reversa.

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''a'', ''b'', ''c'', ''b'', ''a'', ''a'']; review.reduceRight(function(acc, item, index, object) { if (item === ''a'') { object.splice(index, 1); } }, []); log(review);

<pre id="out"></pre>

O podríamos usar ES5 Array.prototype.splice como tal.

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''a'', ''b'', ''c'', ''b'', ''a'', ''a''], index = review.indexOf(''a''); while (index !== -1) { review.splice(index, 1); index = review.indexOf(''a''); } log(review);

<pre id="out"></pre>

Pero específicamente desea utilizar ES5 Array.prototype.splice , ¿qué podemos hacer? Bueno, necesitamos usar Array.prototype.splice para hacer una copia superficial de la matriz y Array.prototype.splice para que podamos trabajar en reversa para mutar la matriz original.

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''a'', ''b'', ''c'', ''b'', ''a'', ''a'']; review.slice().reverse().forEach(function(item, index, object) { if (item === ''a'') { review.splice(object.length - 1 - index, 1); } }); log(review);

<pre id="out"></pre>

Finalmente, ES6 nos ofrece algunas alternativas adicionales, donde no necesitamos hacer copias superficiales y revertirlas. Notablemente podemos usar Generadores e Iteradores . Sin embargo, el soporte es bastante bajo en la actualidad.

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } function* reverseKeys(arr) { var key = arr.length - 1; while (key >= 0) { yield key; key -= 1; } } var review = [''a'', ''a'', ''b'', ''c'', ''b'', ''a'', ''a'']; for (var index of reverseKeys(review)) { if (review[index] === ''a'') { review.splice(index, 1); } } log(review);

<pre id="out"></pre>

Algo a tener en cuenta en todo lo anterior es que, si eliminara NaN de la matriz, entonces comparar con iguales no funcionaría porque en Javascript NaN === NaN es falso. Pero vamos a ignorar eso en las soluciones, ya que es otro caso marginal no especificado.

Entonces ahí lo tenemos, una respuesta más completa con soluciones que aún tienen casos límite. El primer ejemplo de código sigue siendo correcto, pero como se dijo, no está exento de problemas.


También puede usar indexOf para hacer esto

var i = review.indexOf(''/u2022 /u2022 /u2022''); if (i !== -1) review.splice(i,1);


Utilice Array.prototype.filter lugar de forEach :

var pre = document.getElementById(''out''); function log(result) { pre.appendChild(document.createTextNode(result + ''/n'')); } var review = [''a'', ''b'', ''c'', ''b'', ''a'', ''e'']; review = review.filter(item => item !== ''a''); log(review);