add function to show diff between two objects

This commit is contained in:
Dan Percic 2022-03-17 15:34:15 +02:00
parent 8a992aa440
commit 3e1b124bd9

View File

@ -1,6 +1,7 @@
import { ITrackable } from '../listing/models/trackable';
import moment from 'moment';
import { FormGroup } from '@angular/forms';
import _ from 'lodash';
export function capitalize(value: string): string {
if (!value) {
@ -82,3 +83,33 @@ export function getLeftDateTime(ISOString: string) {
return { daysLeft, hoursLeft, minutesLeft };
}
export function deepDiffObj(base: Record<string, unknown>, object: Record<string, unknown>) {
if (!object) {
throw new Error(`The object compared should be an object: ${object}`);
}
if (!base) {
return object;
}
const res = _.transform(object, (result: Record<string, unknown>, value, key) => {
if (!_.has(base, key)) {
result[key] = value;
} // fix edge case: not defined to explicitly defined as undefined
if (!_.isEqual(value, base[key])) {
result[key] =
_.isPlainObject(value) && _.isPlainObject(base[key])
? deepDiffObj(base[key] as Record<string, unknown>, value as Record<string, unknown>)
: value;
}
});
// map removed fields to undefined
_.forOwn(base, (value, key) => {
if (!_.has(object, key)) {
res[key] = undefined;
}
});
return res;
}