var myArray = [1,2,3,4,5,6,7,8,9];
function isOdd(value){
return value % 2;
}
for(var i = 0; i < myArray.length; i++){
if(isOdd(myArray[i])){
myArray.splice(i,1);
i--;
}
}
Il codice sopra prende una matrice di lunghezza arbitraria e controlla ciascun valore. Se il valore del bit dell'array soddisfa una condizione arbitraria (in questo caso se è dispari), viene rimosso dall'array.Durante il looping dei valori di un array JS e rimuovo il valore, devo usare mentre invece di?
Array.prototype.splice()
viene utilizzato per rimuovere il valore dall'array e quindi i
viene decrementato per tenere conto del resto dei valori nell'array "moving down" per riempire lo spazio vuoto lasciato dal valore rimosso (quindi il ciclo non 'salta su un valore).
Tuttavia, il ciclo for
termina quando i
corrisponde alla lunghezza dell'array, che diventa più breve man mano che i valori vengono rimossi.
Il valore di myArray.length
diminuisce dinamicamente come procede il ciclo, o salva il valore all'inizio del ciclo e non si aggiorna quando i valori vengono rimossi? Se quest'ultimo, cosa posso fare per risolvere il mio ciclo?
Grazie!
Suggerirei che il metodo 'Array.prototype.filter()' di ordine superiore è la scelta migliore per questo tipo di operazione. Il codice dipendente dal metodo 'filter()' è considerevolmente più conciso e, direi, considerevolmente più leggibile. – Tex
hai ragione, ma il problema è uno con la giuntura, e gli svantaggi di esso con il ciclo. –
@Tex - '.filter()' è sicuramente più facile da usare, ma crea una nuova matrice piuttosto che modificare l'array originale che non è la stessa implementazione dell'OP. A volte, se un altro codice ha un riferimento a questo array, si desidera modificare l'array piuttosto che sostituirlo con uno nuovo. – jfriend00