Estoy tratando de contar los caracteres en una cadena usando un objeto. Esta es la función que escribí:
function maxChar(str) { let obj = {} for(let char of str){ if(obj[char]){ obj[char] += 1 } obj[char] = 1 } console.log(obj) }Cuando ejecuto la función con la cadena "¡Hola!" vuelve:
{ : 1, !: 1, e: 1, H: 1, h: 1, l: 1, o: 1, r: 1, T: 1 }Lo cual, por supuesto, no está contando correctamente. Si cambio la declaración if de esta manera:
function maxChar(str) { let obj = {} for(let char of str){ if(!obj[char]){ obj[char] = 1 } obj[char] += 1 } console.log(obj) }Vuelve
{ : 2, !: 2, e: 4, H: 2, h: 2, l: 3, o: 2, r: 2, T: 2 }¿No se supone que ambas funciones hacen lo mismo? ¿Por qué está pasando esto?
Su primera versión se ve así. He añadido algunos comentarios:
for(let char of str){ if(obj[char]){ obj[char] += 1 // this happens only when the `if` condition is met } obj[char] = 1 // this happens all the time, regardless of the `if` condition }Esa versión siempre restablecerá el conteo de caracteres a 1. Incluso si hubiera incrementado brevemente el conteo a 2, aún lo restablecerá a 1 inmediatamente después de haberlo hecho.
Una solución (que más se acerque a su código original) podría ser:
for(let char of str){ if(obj[char]){ obj[char] += 1 } else { obj[char] = 1 } }