Quería saber si también es posible usar el método de reduce en matrices con cadenas.
Por ejemplo: si tengo una matriz como esta: [ 'm', 'o', 'o', 'n' ] entonces puedo reducirla a un objeto como este: { m: 1, o: 2, n: 1 } , que cuenta las ocurrencias de todos los caracteres en la cadena.
Pero si en cambio tuviera una cadena "moon" , no podría usar el método de reduce con ella.
Sé que puedo escribir una implementación personalizada para reduce , pero ¿hay algo más simple?
Sí , dado que Array.prototype.reduce es un método genérico, no requiere que this valor sea necesariamente una matriz. Lo que significa que reduce está diseñado no solo para trabajar con matrices, sino también para trabajar con otros valores similares a matrices, como cadenas.
Y para usar reduce con la cadena str , puede invocarlo en la cadena usando Function.prototype.call .
const str = "moon"; const strCharCount = Array.prototype.reduce.call( str, (r, s) => { r[s] = (r[s] ?? 0) + 1; return r; }, {} ); console.log(strCharCount); Y si todo eso no tiene ningún sentido, también puede transformar la cadena en una matriz y usar reduce como lo haría normalmente.
const str = "moon"; const strCharCount = Array.from(str).reduce((r, s) => { r[s] = (r[s] ?? 0) + 1; return r; }, {}); console.log(strCharCount);