Estoy tratando de obtener una matriz de claves, que eran diferentes como resultado de comparar dos objetos. Solo pude hacerlo usando isEqualWith y mapKeys , así:
const differencies = []; const objA = { a: 1, b: 2, c: 3 }; const objB = { a: 1, b: 2, c: 100 }; function customizer(objOne, objTwo) { if (lodash.isEqual(objOne, objTwo)) { return true; } lodash.mapKeys(objOne, (value, key) => { if (value !== objTwo[key]) { differencies.push(key); } }); return false; } lodash.isEqualWith(objA, objB, customizer); console.log(differencies); <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> <script>const lodash = _;</script>La pregunta es : ¿Hay una mejor manera de obtener claves de objetos que difieren usando lodash?
Dado que solo necesita comparar objetos donde las claves son idénticas pero los valores pueden diferir, puede aprovechar keys() o keysIn() (si desea atravesar también la cadena de prototipos) y eliminar todas las entradas que no tienen un valor coincidente con filter() .
const objA = { a: 1, b: 2, c: 4 }; const objB = { a: 1, b: 2, c: 100 }; const differencies = lodash.filter( lodash.keys(objA), key => objA[key] !== objB[key] ); console.log(differencies); <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> <script>const lodash = _;</script>Alternativamente, usando la sintaxis de encadenamiento :
const objA = { a: 1, b: 2, c: 4 }; const objB = { a: 1, b: 2, c: 100 }; const differencies = lodash(objA) .keys() .filter(key => objA[key] !== objB[key]); console.log(differencies); <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> <script>const lodash = _;</script> Para este tipo de funcionalidad, Lodash podría ser una exageración. El equivalente simple de JavaScript es Object.keys() y Array#filter() :
const objA = { a: 1, b: 2, c: 4 }; const objB = { a: 1, b: 2, c: 100 }; const differencies = Object.keys(objA) .filter(key => objA[key] !== objB[key]); console.log(differencies);