He visto preguntas similares como esta antes, como contar caracteres en una cadena determinada. Sin embargo, cuando se trata de comparar una cadena dada con las letras del alfabeto y devolver un objeto con ocurrencias como:
const letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] const sampleString = "a bee"; const results = { a: 1, b: 1, c: 0, d: 0, e: 2, f: 0, ... }Podemos usar Array.reduce() , para contar letras en sampleString.
Comenzamos creando un letterMap para especificar todas las letras válidas para contar.
En el ciclo de reducción, solo incrementamos las letras que están presentes en el mapa de letras, usando la expresión (c in acc).
const letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] const sampleString = "a bee"; const letterMap = letters.reduce((acc, c) => { acc[c] = 0; return acc; }, {}); const result = [...sampleString].reduce((acc, c) => { if (c in acc) acc[c]++; return acc; }, letterMap); console.log('Result:', result) .as-console-wrapper { max-height: 100% !important; top: 0; } Aquí hay otra forma, usando solo un bucle, nuevamente usando Array.reduce() , esto supone que no deseamos contar los espacios en blanco:
const letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] const sampleString = "a bee"; const result = [...letters, ...sampleString].reduce((acc, c) => { if (c in acc) { acc[c]++; } else if (c.trim()) { acc[c] = 0; } return acc; }, {}); console.log('Result:', result) .as-console-wrapper { max-height: 100% !important; top: 0; }Me gusta usar Object.fromEntries para esto:
const sampleString = "a bee"; const result = Object.fromEntries(Array.from("abcdefghijklmnopqrstuvwxyz", ch => [ch, 0])); for (let ch of sampleString) if (ch in result) result[ch]++; console.log(result);Usar Array.reduce y String.match puede ser una idea. Entonces, para cada letra de letters , use la match (longitud) para determinar la frecuencia de la letra en la muestra dada.
const letters = `abcdefghijklmnopqrstuvwxyz`.split(``); const freq = (chr, sample) => (sample.match(RegExp(chr, `g`)) || []).length; const result = letters.reduce( (acc, chr) => ({...acc, [chr]: freq(chr, acc.sample)}), {sample: "a bee"}); console.log(result);