Traté de escribir un código javascript que se multiplica con el número de salarios de cada persona y los convierte en una cadena con JSON.stringify.
Por ejemplo, en sueldos , el nombre y el sueldo original están aquí así:
let salaries = { james:100000, john:200000, jane:300000 };y quiero expresar así: {james:110000,john:220000,jane:330000}
Entonces, escribí el código como...
let payjson = JSON.stringify(pays, function replacer(key, value){ return value*1.1; }); // 1st tryy obtuve un error, los valores se cambiaron como [objeto Objeto], NaN.
Sin embargo, este código simplemente funcionó para mí.
let payjson = JSON.stringify(pays, function replacer(key, value){ return Number.isInteger(value)? Math.floor(value*1.1): value; }); // 2nd tryMe pregunto por qué el primero no funcionó como yo quería y el segundo simplemente funcionó como yo quería.
Como explica claramente la documentación de la función stringify(), la función de reemplazo se pasa inicialmente al objeto y luego a cada una de las propiedades. Entonces, estás viendo este comportamiento. La primera vez que el valor entra como tipo de object y se intenta la multiplicación, falla y posteriormente no pasa las propiedades, por lo que el retorno general de stringify() es nulo. En su código de segundo intento, está verificando el value y solo si es de numeric type , está haciendo los cálculos y devolviendo un valor calculado, que stringify() usa para agregar a la cadena de salida.
Ver la documentación , y principalmente este párrafo:
Inicialmente, la función de reemplazo se llama con una cadena vacía como clave que representa el objeto que se está encadenando. Luego se llama para cada propiedad en el objeto o matriz que se está encadenando.
Parece que desea crear una copia del objeto original con salarios un 10% más altos:
const salaries = { james:100000, john:200000, jane:300000 }; const res=Object.fromEntries(Object.entries(salaries).map(([k,v])=>[k,1.1*v])); console.log(res); // this can be strigified too: console.log(JSON.stringify(res)); // and the input object is unchanged: console.log(salaries);Cuando se llama por primera vez a la función de replacer , a key se le asigna una cadena vacía. Sin embargo, aún se espera que la función devuelva value , de lo contrario, termina.
let salaries = { james:100000, john:200000, jane:300000 }; document.write(JSON.stringify(salaries,(k,v)=>{return k==''?v:Math.floor(v*1.1);}));