2012-02-15 13 views
16

Estoy tratando de hacer una función removeAll(), que eliminará todos los elementos de una matriz con ese valor particular (no índice).Cómo eliminar varios elementos de una matriz por valor?

La parte difícil viene cuando realizamos cualquier cambio en el ciclo, los índices tienden a moverse (lo que hace que sea muy difícil hacerlo funcionar como queremos) y reiniciar el ciclo cada vez que hacemos cambios es muy ineficiente en grandes arreglos

Hasta el momento, escribí mi propia arr.indexOf función (por mayor soporte IE), que se ve así:

function arrFind(val, arr) { 
    for (var i = 0, len = arr.length, rtn = -1; i < len; i++) { 
     if (arr[i] === val) { 
      return i; 
     } 
    } 
    return -1; 
} 

Es fácil de eliminar elementos como este:

var myarray = [0, 1, 2, 3, 4]; 
var tofind = 2; 

var stored_index = arrFind(tofind, myarray); 
if (stored_index != -1) { 
    myarray.splice(stored_index, 1); 
} 

alert(myarray.join(",")); //0,1,3,4 

Sin embargo, como señalé anteriormente, al hacer esto mientras bucleo, nos metimos en problemas.

¿Alguna idea sobre cómo eliminar correctamente los elementos de la matriz al recorrerlos?

+0

[encontraron esta pregunta relacionada] (http://stackoverflow.com/q/3954438/908879) (pero es _No_ un DUP porque mi pregunta es sobre problem_ _a al retirar _múltiples_ artículos _Inside un loop_) – ajax333221

Respuesta

42

Haz un ciclo en orden inverso o compila una nueva matriz con los elementos que no se deben quitar.

+0

edificio una nueva matriz solo con los elementos que son '! =' a la que quiero eliminar es una buena idea! Haré esto. – ajax333221

+10

'Loop en orden inverso' - * facepalm * - muchas gracias! –

+0

¡Eres un maldito héroe! – svarog

22

Cada navegador tiene un método de filtro Matriz:

var myarray=[0,1,2,3,4]; 
var removal=2; 
var newarray=myarray.filter(function(itm){return itm!==removal}); 
1

escribí esta pequeña función donde arr es la matriz original y d1, d2 los valores que desea eliminar. Me pregunto cómo se podría generalizar a una cantidad arbitraria de valores para eliminar. Bueno, solo soy un principiante.

function destroyer(arr, d1, d2) { 
    var lean =[]; 
    for (var i = 0; i<arr.length; i++) { 
     if (arr[i] != d1 && arr[i] != d2) { 
      lean.push(arr[i]); 
     } 
    } 
    return lean; 
4

Pruebe este. Solo tiene que verificar los índices de los números que le gustaría eliminar. He agregado elementos adicionales en tu matriz.

var myarray = [0, 1, 2, 3, 2, 2, 2, 5, 6]; 
var indicesToRemove = new Array(); 

for(i=0;i<myarray.length;i++){ 
    if(myarray[i]===2){ //let's say u wud like to remove all 2 
     indicesToRemove.push(i); //getting the indices and pushing it in a new array 
    } 
} 

for (var j = indicesToRemove.length -1; j >= 0; j--){ 
    myarray.splice(indicesToRemove[j],1); 
} 

alert(JSON.stringify(myarray)); //myarray will be [0,1,3,5,6] 
+1

Esta respuesta es mejor que la aceptada, porque tiene código y en realidad conserva el orden de eliminación. –

Cuestiones relacionadas