Tengo una matriz y me gustaría encontrar todas las coincidencias vecinas y contarlas, luego devolver el conteo, realizado en un bucle como .map() para que no sea necesario almacenar una memoria de lo que se contó más allá del elemento actual. necesito usar esta cantidad de elementos actuales para reservar suficientes espacios para cada grupo de elementos
array = [ball, batter, batter, amount, amount, github, github, github, account, account, account, account, account, account, account, github, github, github]El ejemplo de los resultados deseados de esta matriz sería: en el primer bucle devolvería 1, el segundo bucle devolvería 2, luego 2, luego 3, luego 7, luego 3
y este conteo se usaría como variable para reservar espacio, algo así como
number to reserve: count por lo tanto, a través de cada ciclo, el count variable se cambiaría y actualizaría al conteo de elementos actual, y el ciclo que cuenta no se detendría hasta que el siguiente elemento no coincida con el elemento actual, y el count variable tampoco estará disponible para usar hasta que se encuentren todas las coincidencias simultáneas, por lo que si pongo console.log(count) al final de la función obtendría cada número de salida individualmente
Puede contar fácilmente la cadena consecutiva en una matriz como:
const array = ["ball", "batter", "batter", "amount", "amount", "github", "github", "github", "account", "account", "account", "account", "account", "account", "account", "github", "github", "github"] const result = []; let last = array[0], lastSameIndex = 0; for (let i = 1; i < array.length; ++i) { if (array[i] !== last) { result.push(i - lastSameIndex); lastSameIndex = i; last = array[i]; } } result.push(array.length - lastSameIndex); console.log(result);Declaremos algunos valores iniciales como
last = array[0] , por lo que last = "ball" y lastSameIndex = 0
Entonces, debemos comenzar desde el índice 1 y solo debemos considerar un solo caso en el que los dos elementos no son iguales, es decir array[i] !== last . Si no son iguales, tenemos que empujar el conteo del mismo elemento hasta ahora como:
result.push(i - lastSameIndex); Ahora, tenemos que actualizar el nuevo valor y el índice, es decir, last elemento desde donde tenemos que contar ese elemento nuevamente.
lastSameIndex = i; last = array[i]; Hasta aquí todo bien, pero también tenemos que manejar un caso en el que finaliza el ciclo. En este caso, tenemos que empujar el conteo del último elemento desde donde comenzó el conteo, es decir, last inicio o lastSameIndex hasta el último elemento.
result.push(array.length - lastSameIndex); Second solution
const array = [ "ball", "batter", "batter", "amount", "amount", "github", "github", "github", "account", "account", "account", "account", "account", "account", "account", "github", "github", "github"]; let lastStr = "", num = 0; const result = array .map((s) => { if (lastStr !== s) { lastStr = s; num = num === 0 ? 1 : 0; } return num; }) .join("") .match(/(\d)\1*/g) .map((s) => s.length); console.log(result);Entonces, haga un bucle en cada elemento, si no es igual al último elemento, presione 1 , de lo contrario, agregue 1 al último número en la matriz.
const items = ["ball", "batter", "batter", "amount", "amount", "github", "github", "github", "account", "account", "account", "account", "account", "account", "account", "github", "github", "github"] const results = []; items.forEach((item, i) => { if (items[i - 1] !== item) return results.push(1); const last = results.length - 1; results[last] = results[last] + 1; }); console.log(results);array.join(",") : ball,batter,batter,amount,amount,github,github,github/([az]+,)\1*/gi para que coincida con la misma palabra repetida Da: ['ball,', 'batter,batter,', 'amount,amount,', 'github,github,github,...]s.split(',').length-1Guion:
array.join(",").match(/([az]+,)\1*/gi).map((s) => `${s.split(',').length-1}`); Resultado: ['1', '2', '2', '3', '7', '2']