Tengo una matriz en la que quiero verificar todas las instancias de una letra específica donde hay valores vacíos en el medio o son adyacentes.
let myArray1 = ['A',,,,,'A'] //function returns [0,5] let myArray2 = ['A',,,'E',,'A'] //function returns [] let myArray3 = [,,'A',,'A','G'] //function returns [2,4] let myArray4 = [,,'A','A','G'] //function returns [2,3] let myArray5 = [,,'A','A','G','A'] //function returns [2,3]He estado intentando con un bucle for y push to array pero me estoy confundiendo.
¿Alguna idea sobre cómo hacer esta función?
Podría usar .findIndex() para encontrar el primer valor no vacío (es decir, el carácter) y su índice en su matriz. Luego puede usar .findIndex() nuevamente en su matriz para encontrar el segundo valor no vacío que aparece después de su primer carácter. Si el primer carácter y el segundo carácter coinciden, puede devolver los índices; de lo contrario, puede devolver una matriz vacía:
const getRange = (arr) => { const first = arr.findIndex(c => c !== undefined); const second = arr.findIndex((c, i) => i !== first && c !== undefined); return first !== -1 && arr[first] === arr[second] ? [first, second] : []; } console.log(getRange([,,,,,])); console.log(getRange(['A',,,,,'A'])); console.log(getRange(['A',,,'E',,'A'])); console.log(getRange([,,'A',,'A','G'])); console.log(getRange([,,'A','A','G'])); console.log(getRange([,,'A','A','G','A'])); Para optimizar, puede hacer esto con una sola pasada usando un bucle regular for..of iterando las .entries() de la matriz;
const getRange = (arr) => { let first = -1; let second = -1; for(const [i, char] of arr.entries()) { if(char !== undefined && first === -1) first = i; else if(char !== undefined && second === -1) second = i; } return first !== -1 && arr[first] === arr[second] ? [first, second] : []; } console.log(getRange([,,,,,])); console.log(getRange(['A',,,,,'A'])); console.log(getRange(['A',,,'E',,'A'])); console.log(getRange([,,'A',,'A','G'])); console.log(getRange([,,'A','A','G'])); console.log(getRange([,,'A','A','G','A'])); function getMyResult(itemToSearch, array) { var firstIndex; var secondIndex; for (var i = 0; i < array.length; i++) { if (array[i] == itemToSearch) { if (firstIndex == null) firstIndex = i; else { secondIndex = i; break; // break loop as we got two success indices } } else if (array[i] != null) { if (firstIndex != null) { // something got in between the items break; } } } if (firstIndex != null && secondIndex != null) return [firstIndex, secondIndex]; // success indices return []; //not success } let myArray1 = ['A',,,,,'A']; let myArray2 = ['A',,,'E',,'A']; //function returns [] let myArray3 = [,,'A',,'A','G']; //function returns [2,4] let myArray4 = [,,'A','A','G']; //function returns [2,3] let myArray5 = [,,'A','A','G','A']; //function returns [2,3] console.log( getMyResult('A', myArray1) ); console.log( getMyResult('A', myArray2) ); console.log( getMyResult('A', myArray3) ); console.log( getMyResult('A', myArray4) ); console.log( getMyResult('A', myArray5) ); La función anterior getMyResult resolverá su problema.
Puede usar for loop para realizar un seguimiento del último valor y su índice, si el último valor es el mismo que el valor actual, puede interrumpir el ciclo; de lo contrario, puede restablecer el último valor y comenzar el índice.
const getRange = (arr) => { let last = '', start = -1, end = -1; for(let i = 0; i < arr.length; i++) { if(arr[i]) { if(last === arr[i]) { end = i; break; } else { start = i; last = arr[i]; } } } return end !== -1 ? [start, end]: [] } console.log(getRange(['A',,,,,'A'])); console.log(getRange(['A',,,'E',,'A'])); console.log(getRange([,,'A',,'A','G'])); console.log(getRange([,,'A','A','G'])); console.log(getRange([,,'A','A','G','A'])); console.log(getRange([,,,'E',,'E',,,,,'E'])); console.log(getRange([,,'A',,'G','A',,,,,'A'])); console.log(getRange(['A',,,'E',,'A']));