Estoy tratando de trabajar con datos que se asemejan a este tipo de objeto:
const sampleData = { coyotes: '', armadillos: false, wombats: [''], geckos: 0, dogs: { beagle: '', bulldog: '' }, wolves: [ { type: '', color: '', range: '', status: { endangered: true, protected: false } } ], cats: {} }Como puede ver, tiene una combinación de diferentes tipos de JavaScript: cadenas, booleanos, números, etc.
Cuando algo en el formulario cambia, necesito comparar el objeto antiguo con el objeto modificado y verificar la igualdad, entre otras cosas. Para determinar si algo ha cambiado, uso esta función recursiva:
export const getChangedValues = (initialValues, values) => { return Object .entries(values) .reduce((acc, [key, value]) => { const hasChanged = initialValues[key] !== value if (hasChanged) { acc[key] = value } return acc }, {}) }Sin embargo, cuando comparo objetos nuevos con viejos usando lodash isEqual, obtengo un falso para los valores numéricos porque nuestros campos guardan números como cadenas (no tengo control sobre eso).
Entonces, uso esto para convertir SOLO los números en el objeto a cadenas, porque necesito dejar todo lo demás solo (especialmente los valores booleanos):
export const convertValuesToStrings = (obj) => { return _.cloneDeepWith(obj, value => { return (_.isNumber(value)) ? _.toString(value) : undefined }) }Esto funciona perfectamente para convertir números en cadenas, pero obtengo un falso positivo para los objetos anidados. Después de ejecutar el convertidor de cadenas y luego verificar si ha habido un cambio, también devuelve objetos, incluso si sus datos subyacentes no han cambiado.
Todavía estoy aprendiendo las áreas más complejas de JavaScript, como la recursividad. ¿Alguien puede ver lo que me estoy perdiendo aquí?
La conclusión es que necesito comparar recursivamente dos objetos después de convertir cualquier valor numérico (y SOLO valores numéricos) en cadenas. :)
Para mantener esto simple, ¿ha intentado comparar los objetos usando JSON.stringify() ?
if(JSON.stringify(oldObject) === JSON.stringify(newObject)) { console.log('objects are basically equal' ) }Este enfoque es bastante simple para comparar completamente un objeto profundo. Esto no se puede modificar demasiado, pero resuelve el problema utilizando una función incorporada probada y le permite concentrarse en escribir la aplicación real.