Estoy tratando de convertir una matriz de números (representados como cadenas) en una matriz de números.
Aquí hay una matriz de ejemplo: [ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] ; los números pueden tener los sufijos convencionales "K" y "M", que denotan factores de 1000 y 1000000, respectivamente. La salida deseada del ejemplo anterior es [39400, 83400, 1500000, 111300, 5878] .
Esto es lo que tengo hasta ahora:
var sample = [ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] function convert(arr) { var conversions = {'K':1000, 'M':1000000} var result = [] for (entry of arr) { var sep = entry.split(/(?=[AZ])/) if (sep.length == 1) { result.push(parseFloat(sep[0])) } else { var number = parseFloat(sep[0]) * conversions[sep[1]] result.push(number) } } return result } console.log(convert(sample))Creo que esto funciona, pero ¿hay alguna forma de mejorar mi código? Habría asumido que JS tiene algo para convertir automáticamente diferentes representaciones de números. Cualquier consejo o sugerencia (usando solo Vanilla JS) es muy apreciado.
Al convertir una matriz en otra mediante la transformación de cada elemento, .map es el enfoque adecuado. En lugar de parseFloat(sep[0]) , considere desestructurar el resultado dividido y multiplicar condicionalmente con el valor de conversions para un enfoque más conciso.
const sample = [ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] const conversions = {'K': 1e3, 'M': 1e6}; const convert = arr => arr.map((str) => { const [numPart, suffix] = str.split(/(?=[AZ])/); return numPart * (suffix ? conversions[suffix] : 1); }); console.log(convert(sample))Puede mapear los resultados y tomar la unidad del objeto o uno después de dividir.
function convert(array) { const conversions = { K: 1000, M: 1000000 }; return array.map(s => { const [v, u] = s.split(/(?=[KM]$)/); return v * (conversions[u] || 1); }); } console.log(convert(['39.4K', '83.4K', '1.5M', '111.3K', '5878']))