JSFiddle - React, Tailwind, and code Playground

by denova

JavaScript

console.clear()

var deepDiffMapper = function() {
  return {
    VALUE_CREATED: 'created',
    VALUE_UPDATED: 'updated',
    VALUE_DELETED: 'deleted',
    VALUE_UNCHANGED: 'unchanged',
    VALUE_CHANGED: 'changed',
    getDiffMap: function(obj1, obj2) {
        if (this.isValue(obj1) || this.isValue(obj2)) {
            return {
                status: this.compareValues(obj1, obj2),
                data: obj2,
                isArray: this.isArray(obj1) || this.isArray(obj2),
                compared: true
            };
        }

        var diff = {};
        Object.keys(obj1).forEach(key => {
        	var value2 = undefined;
          if (obj2[key] !== undefined) {
            value2 = obj2[key];
          }
          const answer = this.getDiffMap(obj1[key], value2);
          const status = this.getStatus(answer);
          diff[key] = answer.status ? answer : { status, data: answer, isArray: this.isArray(value2)}
        })
        Object.keys(obj2).forEach(key => {
        		if (diff[key] !== undefined) {
              return;
            }

            const answer = this.getDiffMap(undefined, obj2[key]);
            const status = this.getStatus(answer);
            diff[key] = answer.status ? answer : { status, data: answer, isArray: this.isArray(obj2[key]) }
        })

        return diff;
    },
    getStatus: function(obj) {
    	let status = this.VALUE_UNCHANGED;
      if (!obj.status){
      	Object
        	.keys(obj)
          .map(key => { if (obj[key].status !== this.VALUE_UNCHANGED) { status = this.VALUE_CHANGED } })
      }
      return status;
    },
    compareValues: function(value1, value2) {
        if (value1 === value2) {
            return this.VALUE_UNCHANGED;
        }
        if (this.isDate(value1) && this.isDate(value2) && value1.getTime() === value2.getTime()) {
            return this.VALUE_UNCHANGED;
        }
        if (typeof(value1) === 'undefined') {
            return this.VALUE_CREATED;
        }
        if...