2012-02-15 11 views
16

Sto cercando di creare una funzione removeAll(), che rimuoverà tutti gli elementi di una matrice con quel particolare valore (non indice).Come eliminare più elementi di una matrice in base al valore?

La parte difficile arriva quando apportiamo modifiche al ciclo, gli indici tendono a muoversi (rendendo molto difficile farlo funzionare come vogliamo) e, riavviare il ciclo ogni volta che apportiamo modifiche è molto inefficiente su grandi matrici.

Finora, ho scritto il mio arr.indexOf funzione (ad anziani supporto IE), sembra che questo:

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

E 'facile da rimuovere gli elementi di questo tipo:

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 

Tuttavia, come ho sottolineato in precedenza, quando lo facciamo durante il ciclo, ci mettiamo nei guai.

Qualche idea su come rimuovere correttamente gli elementi dell'array mentre lo si scorre?

+0

[pensa che questa domanda relativa] (http://stackoverflow.com/q/3954438/908879) (ma è _non_ un DUP perché la mia domanda riguarda _a problem_ quando si rimuovono gli elementi _multiple_ _inside un loop_) – ajax333221

risposta

42

Passare in ordine inverso o creare un nuovo array con gli elementi che non devono essere rimossi.

+0

edificio un nuovo array solo con gli elementi che sono '! =' a quello che voglio rimuovere è una buona idea !, lo farò. – ajax333221

+10

'Ciclo in ordine inverso '- * facepalm * - grazie mille! –

+0

Sei un dannato eroe !! – svarog

22

Ogni nuovo browser ha un metodo del filtro Array:

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

Ho scritto questa piccola funzione in cui arr è la matrice originale e d1, d2 i valori che si desidera rimuovere. Mi chiedo come possa essere generalizzato a un numero arbitrario di valori da rimuovere. Bene, sono solo 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

Prova questo. Devi solo controllare gli indici dei numeri che vorresti rimuovere. Ho aggiunto elementi aggiuntivi nel tuo array.

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

Questa risposta è migliore di quella accettata, perché ha il codice e in realtà conserva l'ordine di cancellazione. –

Problemi correlati