necesito escribir una funcion
filterRangeInPlace(arr, a, b)
que toma una matriz y dos números y elimina todos los elementos de la matriz que no están dentro del rango a a b . Así que el cheque parece
un ≤ arr[i] ≤ segundo
Quiero hacerlo con el método for loop and splice. Pero no puedo entender por qué la función mantiene algunos elementos fuera del rango, en mi caso a continuación, es el número 3 . Esta no es una tarea casera o lo que sea, solo estoy practicando métodos de matriz. Aquí está mi código:
let myArr = [1, 3, 8, 3, 9, 5, 3, 4, 10, 7, 6, 1] function filterRangeInPlace( arr, a, b ) { for ( i = 0; i < arr.length; i++ ) { if ( arr[i] < a || arr[i] > b ) { arr.splice(i, 1) } } } filterRangeInPlace(myArr, 4, 9) console.log(myArr) // [3, 8, 9, 5, 4, 7, 6]Entiendo que me metí con el índice en alguna parte, pero no puedo averiguar dónde y cómo, ya que el resto funciona bien. ¡Gracias!
Debería comenzar a iterar desde el final de la matriz si está usando empalme aquí y subir al primer elemento como:
for (i = arr.length - 1; i >= 0; i--) { Digamos que está eliminando el primer elemento, es decir, 1 en la posición 0 , luego de eliminar la matriz será
[3, 8, 3, 9, 5, 3, 4, 10, 7, 6, 1] y en ese momento la i se incrementa y se convierte en 1 , por lo que ahora apuntará a 8 como índice 1 .
Entonces, usar splice omitirá algunos de los pasos
let myArr = [1, 3, 8, 3, 9, 5, 3, 4, 10, 7, 6, 1]; function filterRangeInPlace(arr, a, b) { for (i = arr.length - 1; i >= 0; i--) { if (arr[i] < a || arr[i] > b) { arr.splice(i, 1); } } } filterRangeInPlace(myArr, 4, 9); console.log(myArr);Cuando usa splice y todavía está en el mismo ciclo, omite algunos índices (porque splice elimina una cantidad de elementos, por lo que se cambian los índices).
En su ejemplo, el 1 , que es el primero, se elimina, por lo que 3 se convierte en el primero, pero luego salta al segundo ( i++ en el ciclo). No verifica dos veces el mismo índice.
Recomendaría usar el método de filter para hacer eso, o simplemente poner i-- en la línea después del splice .