bbo
Version:
bbo is a utility library of zero dependencies for javascript.
47 lines (37 loc) • 1.26 kB
JavaScript
;
var is_object = require('./is_object.js');
require('./get_tag.js');
require('./is_array.js');
require('./is_string.js');
require('./is_map.js');
require('./is_set.js');
var is_date = require('./is_date.js');
var is_empty = require('./is_empty.js');
var proper_object = require('./proper_object.js');
var objectDiff = (lhs, rhs) => {
if (lhs === rhs) return {}; // equal return no diff
if (!is_object(lhs) || !is_object(rhs)) return rhs; // return updated rhs
var l = proper_object(lhs);
var r = proper_object(rhs);
var deletedValues = Object.keys(l).reduce((acc, key) => {
return r.hasOwnProperty(key) ? acc : { ...acc,
[key]: undefined
};
}, {});
if (is_date(l) || is_date(r)) {
// eslint-disable-next-line eqeqeq
if (l.valueOf() == r.valueOf()) return {};
return r;
}
return Object.keys(r).reduce((acc, key) => {
if (!l.hasOwnProperty(key)) return { ...acc,
[key]: r[key]
}; // return added r key
var difference = objectDiff(l[key], r[key]);
if (is_object(difference) && is_empty(difference) && !is_date(difference)) return acc; // return no diff
return { ...acc,
[key]: difference
}; // return updated key
}, deletedValues);
};
module.exports = objectDiff;