Tengo una función mecanografiada que atraviesa una serie de objetos y los resume. Estaba funcionando si implícito le doy al valor un número, sin embargo, si proviene de la entrada, convierte el valor en una cadena.
const mmrChanges = matches.reduce<IHistory[]>( (previous: IHistory[], match: IMatch, index: number) => { const mmrChange = (match.party_size > 1 ? 20 : 30) * isWon(match); // party game 20 mmr, solo game 30 const prevMmr = previous[previous.length - 1].value; return [ ...previous, { index: index, value: prevMmr + mmrChange, time: new Date(match.start_time * 1000).toISOString().split("T")[0], }, ]; }, [{ index: 0, value: currentMmr, time: "" }] ); console.log(mmrChanges);el tipo de valor es: (propiedad) IHistory.value: número y el mmr actual es: const currentMmr: número
Sin embargo, cuando empiezo a acumular los números de valor, comienza a concatenar valores como cadenas. valor actual = 400
la siguiente iteración se convierte en:
{ "index": 0, "value": "40030", "time": "2022-01-25" }Traté de forzarlo a numerar explícitamente dentro de la función de reducción con "como número". También probé la función parseInt (), pero luego mecanografiado arroja un error. No puedo transformar el número en int.
¿Que me estoy perdiendo aqui? Si cambio el Mmr actual a 0, funciona según lo previsto.
Esta solución a continuación parece haber logrado los resultados deseados:
const mmrChanges = matches.reduce<IHistory[]>( (previous: IHistory[], match: IMatch, index: number) => { const mmrChange = (match.party_size > 1 ? 20 : 30) * isWon(match); // party game 20 mmr, solo game 30 const prevMmr = previous[previous.length - 1].value; return [ ...previous, { index: index, value: prevMmr + mmrChange, time: new Date(match.start_time * 1000).toISOString().split("T")[0], }, ]; }, [{ index: 0, value: parseInt(currentMmr.toString()) || 0, time: "" }] ); console.log(mmrChanges);¿Qué cambió?
El agregador .reduce se estableció en [{ index: 0, value: parseInt(currentMmr.toString()) || 0, time: "" }]
¿Por qué?
En la pregunta, currentMmr podría ser cualquier valor. Para garantizar que siempre sea un int, la propiedad de value se establece como parseInt(currentMmr.toString()) . El .toString() asegura que en caso de que currentMmr sea un número entero, todavía se trata como una cadena. Y, parseInt transforma la cadena en un int.
Nota: Esta solución responde a esta pregunta en particular. Es posible que no funcione TAL CUAL en otros contextos y es posible que deba personalizarse.