Considere esta matriz:
const arr = [ [1, 2, 3, 4, 3, 2, 4] ,[1, 0, 3, 4, 3, 2, 0] ,[undefined, 0, null, 4, 3, null, 0] ,[undefined, undefined, 5, 7, undefined, null, undefined] ];Mi tarea es recortar cada matriz. Los valores válidos son enteros (o flotantes, lo mismo). 0 también se considera válido. Recortar en este caso significa que la matriz debe recortarse al principio y al final.
En los ejemplos anteriores:
arr[0] does not need to remove any element arr[1] does not need to remove any element arr[2] needs to remove arr[2][0] arr[3] needs to remove arr[3][0], arr[3][1] from the beginning and arr[3][4], arr[3][5], arr[3][6] at the end.Mi enfoque ha sido el siguiente:
Primero descubra el primer elemento válido en una matriz:
const foundStartIndex = arr[x].findIndex(el => el >= 0);Esto me ayudará a dividir la matriz al principio.
Pero, ¿cómo averiguo por dónde empezar a eliminar al final? Hay un "lastIndexOf" pero parece que no acepta una función de la misma manera que lo hace "findIndex". Podría revertir la matriz, encontrar el primer elemento válido y calcular dónde deberían estar los lugares cuando se revertirá. Pero tal vez hay una mejor manera de hacer esto? Tenga en cuenta que necesito saber dónde, en qué índice, debo comenzar a cortar, ya que el índice se usará por otras razones.
Así es como lo haría.
Divido el problema en 2: recortar la parte izquierda y recortar la parte derecha.
Para recortar la parte izquierda, simplemente recorremos la matriz hasta obtener un número, luego cortamos la matriz desde el principio hasta ese punto.
Para recortar el derecho, es solo un espejo del ajuste izquierdo.
Luego, en buena medida, agregué una función que llama a los otros 2 para facilitar su uso.
Nota: aunque verifiqué un tipo de number , siéntete libre de usar una verificación diferente, como Number.isInteger() o element >= 0 .
/** * @param {Array} arr */ function leftTrimArray(arr) { let i = 0 let element = arr[i] while (typeof element !== 'number') { i++ element = arr[i] } return arr.slice(i) } /** * @param {Array} arr */ function rightTrimArray(arr) { let i = arr.length - 1 let element = arr[i] while (typeof element !== 'number') { i-- element = arr[i] } return arr.slice(0, i + 1) } function trimArray(arr) { return rightTrimArray(leftTrimArray(arr)) } const arrs = [ [1, 2, 3, 4, 3, 2, 4], [1, 0, 3, 4, 3, 2, 0], [undefined, 0, null, 4, 3, null, 0], [undefined, undefined, 5, 7, undefined, null, undefined] ]; arrs.forEach(arr => { console.log(trimArray(arr)); })Siguiendo tu enfoque, te recomiendo lo siguiente:
const reverseEndIndex = arr[x].reverse().findIndex(el => el >= 0); const foundEndIndex = arr[x].length - 1 - reverseLastIndex;La segunda línea de código traduce el índice de la matriz invertida al índice de la matriz no invertida.
No está muy claro a partir de su pregunta por qué necesita usar el índice "por otras razones", pero si necesita matrices limpias que contengan solo números, puede map y luego filter todo lo que no sea null o un número.
const arr = [ [1, 2, 3, 4, 3, 2, 4], [1, 0, 3, 4, 3, 2, 0, 'Bob'], [undefined, 0, null, 4, 3, null, 0, 0.2], [undefined, undefined, 5, 7, undefined, null, undefined] ]; const out = arr.map(n => n.filter(el => { return el !== null && !isNaN(el); })); console.log(out);