js get 2 object differences

by John Wick

JavaScript

// sayop ni, naay send type
function diffObjects1(beforeObj, afterObj) {
  console.log('diffObjects v1');
  const result = {};

  function compareValues(key, beforeVal, afterVal) {
    if (beforeVal !== afterVal) {
      if (typeof beforeVal === 'object' && beforeVal !== null && !Array.isArray(beforeVal)) {
        const nestedDiff = diffObjects(beforeVal, afterVal);
        if (Object.keys(nestedDiff).length > 0) {
          result[key] = nestedDiff;
        }
      } else {
        result[key] = {
          prev: beforeVal,
          new: afterVal
        };
      }
    }
  }

  for (const key in afterObj) {
    if (beforeObj.hasOwnProperty(key)) {
      compareValues(key, beforeObj[key], afterObj[key]);
    } else {
      // If the key exists in afterObj but not in beforeObj, treat beforeVal as undefined
      result[key] = {
        prev: undefined,
        new: afterObj[key]
      };
    }
  }

  return result;
}

// sakto ni
function diffObjects(beforeObj, afterObj) {
  console.log('diffObjects v2');

  let diff = {};

  // Helper function to compare two objects recursively
  function compareValues(beforeVal, afterVal) {
    if (typeof beforeVal === 'object' && !Array.isArray(beforeVal) && beforeVal !== null) {
      // Recursively compare if it's an object
      const nestedDiff = diffObjects(beforeVal, afterVal);
      return Object.keys(nestedDiff).length > 0 ? nestedDiff : null;
    } else if (Array.isArray(beforeVal) && Array.isArray(afterVal)) {
      // Compare arrays
      if (JSON.stringify(beforeVal) !== JSON.stringify(afterVal)) {
        return { prev: beforeVal, new: afterVal };
      }
    } else {
      // Compare primitive values
      if (beforeVal !== afterVal) {
        return { prev: beforeVal, new: afterVal };
      }
    }
    return null;
  }

  for (let key in beforeObj) {
    if (afterObj.hasOwnProperty(key)) {
      const result = compareValues(beforeObj[key], afterObj[key]);
      if (result) {
        diff[key] = result;
      }
...