const { transform, isEqual, isArray, isObject } = require('lodash')
function difference(origObj, newObj) {
function changes(newObj, origObj) {
let arrayIndexCounter = 0
return transform(newObj, function (result, value, key) {
if (!isEqual(value, origObj[key])) {
let resultKey = isArray(origObj) ? arrayIndexCounter++ : key
result[resultKey] =
isObject(value) && isObject(origObj[key])
? changes(value, origObj[key])
: value
}
})
}
return changes(newObj, origObj)
}
const originalObject = {
foo: 'bar',
baz: 'fizz',
cool: true,
what: {
one: 'one',
two: 'two'
},
wow: {
deep: {
key: ['a', 'b', 'c'],
values: '123'
}
},
array: ['lol', 'hi', 'there']
}
const newObject = {
foo: 'bar',
baz: 'fizz',
cool: false,
what: {
one: 'one',
two: 'twox'
},
wow: {
deep: {
key: ['x', 'y', 'c'],
values: '098'
}
},
array: ['lol', 'hi', 'difference']
}
const diff = difference(originalObject, newObject)
console.log(inspect(diff, {showHidden: false, depth: null, colors: true}))
if (diff.cool) {
console.log('Coolness changed to', diff.cool)
}