En el siguiente código, estoy tratando de verificar cuántas veces aparece una letra en una cadena. El problema con el siguiente código es que imprime cada letra más de una vez. Necesita recopilar todas las mismas letras y mostrar la cantidad de veces que ocurre en la cadena y mostrarlo una vez.
const string = 'mississippi' const letters = [...string] let currentLetter = '' let letterOccurance = [] for(let i = 0; i < letters.length; i++){ let letterFrequency = letters.filter((letter)=>{ return letter === letters[i] }) letterOccurance.push([`${letters[i]}`,letterFrequency.length]) } console.log(letterOccurance)Eso es demasiado código solo para obtener la cantidad de veces que aparece una letra en una cadena. Prueba el siguiente código:
const string = 'mississippi'; let frequency = {}; for (let letter of string) { if (frequency[letter]) { frequency[letter]++; } else { frequency[letter] = 1; } } console.log(frequency);Siempre está empujando la letra a la matriz, ya sea que exista allí o no:
letterOccurance.push([`${letters[i]}`,letterFrequency.length])Podrías verificar si existe primero:
if (!letterOccurance.find(l => l[0] === letters[i])) { letterOccurance.push([`${letters[i]}`,letterFrequency.length]) }O incluso sáltatelo por completo si ya lo has visto, ya que la primera vez que encuentras alguna letra ya sabes su cuenta completa:
for(let i = 0; i < letters.length; i++){ if (letterOccurance.find(l => l[0] === letters[i])) { continue; } // the rest of the loop... }Honestamente, hay una variedad de formas en las que puedes dar un paso atrás y volver a abordar el problema. Pero para la pregunta sobre por qué las letras se repiten, eso es simplemente porque cada iteración del bucle agrega incondicionalmente la letra a la matriz resultante.
¿Qué tal si escribimos una función de conteo de elementos más genérica y luego colocamos en capas countLetters como una simple aplicación parcial de la función de identidad?
const countBy = (fn) => ([...xs]) => xs .reduce ((a, x) => {const k = fn (x); a [k] = (a[k] || 0) + 1; return a}, {}) const countLetters = countBy (x => x) console .log (countLetters ('missisippi')) countBy es bastante genérico. Le pasa una función para convertir sus valores en cadenas y pasa su matriz de elementos a la función que devuelve. Las cadenas son lo suficientemente parecidas a una matriz como para que esto solo funcione para nuestro simple countLetters . Pero también podríamos usarlo para otros cargos, como:
countBy (x => x .grade) ([{id: 1, grade: 'A'}, {id: 2, grade: 'B'}, {id: 3, grade: 'A'}]) //=> {"A": 2, "B": 1}