2021-03-24 18:38:36 +01:00
|
|
|
'use strict';
|
|
|
|
const { transform, isEqual, isArray, isObject } = require('lodash');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find difference between two objects
|
|
|
|
* @param {object} origObj - Source object to compare newObj against
|
|
|
|
* @param {object} newObj - New object with potential changes
|
|
|
|
* @return {object} differences
|
|
|
|
*/
|
|
|
|
const difference = (origObj, newObj) => {
|
|
|
|
function changes(newObj, origObj) {
|
|
|
|
let arrayIndexCounter = 0
|
2021-03-27 00:54:41 +01:00
|
|
|
|
|
|
|
const newObjChange = transform(newObj, function (result, value, key) {
|
2021-03-24 18:38:36 +01:00
|
|
|
if (!isEqual(value, origObj[key])) {
|
|
|
|
let resultKey = isArray(origObj) ? arrayIndexCounter++ : key
|
|
|
|
result[resultKey] = (isObject(value) && isObject(origObj[key])) ? changes(value, origObj[key]) : value
|
|
|
|
}
|
2021-03-27 00:54:41 +01:00
|
|
|
});
|
|
|
|
const origObjChange = transform(origObj, function (result, value, key) {
|
|
|
|
if (!isEqual(value, newObj[key])) {
|
|
|
|
let resultKey = isArray(newObj) ? arrayIndexCounter++ : key
|
|
|
|
result[resultKey] = (isObject(value) && isObject(newObj[key])) ? changes(value, newObj[key]) : value
|
|
|
|
}
|
2021-03-24 18:38:36 +01:00
|
|
|
})
|
2021-03-27 00:54:41 +01:00
|
|
|
|
|
|
|
return Object.assign(newObjChange, origObjChange);
|
2021-03-24 18:38:36 +01:00
|
|
|
}
|
2021-03-27 00:54:41 +01:00
|
|
|
|
2021-03-24 18:38:36 +01:00
|
|
|
return changes(newObj, origObj)
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = difference;
|