deep-object-diff-mod

A mod of Matt Phillips' deep-object-diff package: Deep diffs two objects, including nested structures of arrays and objects, and return the difference.

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
deep-object-diff-mod
101.0.45 years ago5 years agoMinified + gzip package size for deep-object-diff-mod in KB

Readme

deep-object-diff-mod

❄️
Deep diff two JavaScript Objects



Build Status Code Coverage version downloads MIT License PRs Welcome
A small library that can deep diff two JavaScript Objects, including nested structures of arrays and objects. This library is a slight mod of Matt Phillips' deep-object-diff package, the only difference being that it will return a 'REMOVED' string instead of undefined in place where objects have been removed from an updated object's array of objects. The use-case for this is for Mongo Database Logging - undefined key-values do not save, meaning logs don't show key-values that have been removed from an object. This solution remedies that issue.

Installation

yarn add deep-object-diff-mod
npm i --save deep-object-diff-mod

Functions available:

- diff(originalObj, updatedObj) returns the difference of the original and updated objects
- addedDiff(original, updatedObj) returns only the values added to the updated object
- deletedDiff(original, updatedObj) returns only the values deleted in the updated object
- updatedDiff(original, updatedObj) returns only the values that have been changed in the updated object
- detailedDiff(original, updatedObj) returns an object with the added, deleted and updated differences

Importing

ES6 / Babel:
import { diff, addedDiff, deletedDiff, updatedDiff, detailedDiff } from 'deep-object-diff-mod';

ES5:
const { diff, addedDiff, deletedDiff, detailedDiff, updatedDiff } = require("deep-object-diff-mod");

// OR

const diff = require("deep-object-diff-mod").diff;
const addedDiff = require("deep-object-diff-mod").addedDiff;
const deletedDiff = require("deep-object-diff-mod").deletedDiff;
const detailedDiff = require("deep-object-diff-mod").detailedDiff;
const updatedDiff = require("deep-object-diff-mod").updatedDiff;

Usage:

diff:

const lhs = {
  foo: {
    bar: {
      a: ['a', 'b'],
      b: 2,
      c: ['x', 'y'],
      e: 100 // deleted
    }
  },
  buzz: 'world'
};

const rhs = {
  foo: {
    bar: {
      a: ['a'], // index 1 ('b')  deleted
      b: 2, // unchanged
      c: ['x', 'y', 'z'], // 'z' added
      d: 'Hello, world!' // added
    }
  },
  buzz: 'fizz' // updated
};

console.log(diff(lhs, rhs)); // =>
/*
{
  foo: {
    bar: {
      a: {
        '1': 'REMOVED'
      },
      c: {
        '2': 'z'
      },
      d: 'Hello, world!',
      e: 'REMOVED'
    }
  },
  buzz: 'fizz'
}
*/

addedDiff:

const lhs = {
  foo: {
    bar: {
      a: ['a', 'b'],
      b: 2,
      c: ['x', 'y'],
      e: 100 // deleted
    }
  },
  buzz: 'world'
};

const rhs = {
  foo: {
    bar: {
      a: ['a'], // index 1 ('b')  deleted
      b: 2, // unchanged
      c: ['x', 'y', 'z'], // 'z' added
      d: 'Hello, world!' // added
    }
  },
  buzz: 'fizz' // updated
};

console.log(addedDiff(lhs, rhs));

/*
{
  foo: {
    bar: {
      c: {
        '2': 'z'
      },
      d: 'Hello, world!'
    }
  }
}
*/

deletedDiff:

const lhs = {
  foo: {
    bar: {
      a: ['a', 'b'],
      b: 2,
      c: ['x', 'y'],
      e: 100 // deleted
    }
  },
  buzz: 'world'
};

const rhs = {
  foo: {
    bar: {
      a: ['a'], // index 1 ('b')  deleted
      b: 2, // unchanged
      c: ['x', 'y', 'z'], // 'z' added
      d: 'Hello, world!' // added
    }
  },
  buzz: 'fizz' // updated
};

console.log(deletedDiff(lhs, rhs));

/*
{
  foo: {
    bar: {
      a: {
        '1': 'REMOVED'
      },
      e: 'REMOVED'
    }
  }
}
*/

updatedDiff:

const lhs = {
  foo: {
    bar: {
      a: ['a', 'b'],
      b: 2,
      c: ['x', 'y'],
      e: 100 // deleted
    }
  },
  buzz: 'world'
};

const rhs = {
  foo: {
    bar: {
      a: ['a'], // index 1 ('b')  deleted
      b: 2, // unchanged
      c: ['x', 'y', 'z'], // 'z' added
      d: 'Hello, world!' // added
    }
  },
  buzz: 'fizz' // updated
};

console.log(updatedDiff(lhs, rhs));

/*
{
  buzz: 'fizz'
}
*/

detailedDiff:

const lhs = {
  foo: {
    bar: {
      a: ['a', 'b'],
      b: 2,
      c: ['x', 'y'],
      e: 100 // deleted
    }
  },
  buzz: 'world'
};

const rhs = {
  foo: {
    bar: {
      a: ['a'], // index 1 ('b')  deleted
      b: 2, // unchanged
      c: ['x', 'y', 'z'], // 'z' added
      d: 'Hello, world!' // added
    }
  },
  buzz: 'fizz' // updated
};

console.log(detailedDiff(lhs, rhs));

/*
{
  added: {
    foo: {
      bar: {
        c: {
          '2': 'z'
        },
        d: 'Hello, world!'
      }
    }
  },
  deleted: {
    foo: {
      bar: {
        a: {
          '1': 'REMOVED'
        },
        e: 'REMOVED'
      }
    }
  },
  updated: {
    buzz: 'fizz'
  }
}
*/

License

MIT