nested-object-diff

1.1.0 • Public • Published

Nested Object Diff

MIT License version

A lightweight javascript diff library for comparing two javascript object nested with supporting matching by value of the object's choosen key name in array.

Installation

npm i --save nested-object-diff

Importing

NodeJs / ES5:

var diff = require("nested-object-diff").diff;

ES6 / Babel:

import { diff } from "nested-object-diff";

Usage:

var diff = require("./dist/index").diff;
 
var lhs = {
  shop: {
    products: [
      { id: 1, name: "a" }, 
      { id: 2, name: "b" }, 
      { id: 3, name: "c" }
    ]
  },
  name: "foo"
};
 
var rhs = {
  shop: {
    products: [
      { id: 1, name: 'a' },
      { id: 4, name: 'd' },
      { id: 5, name: 'e' },
      { id: 3, name: 'cc' }
    ]
  },
  name: "baz"
};
 
var differences = diff(lhs, rhs);
 
//The code snippet above would result only added and deleted propery/element in the following structure describing the differences:
[
  { type: 'A', path: 'shop.products.3', rhs: { id: 3, name: 'cc' } },
  { type: 'E', path: 'shop.products.2.id', lhs: 3, rhs: 5 },
  { type: 'E', path: 'shop.products.2.name', lhs: 'c', rhs: 'e' },
  { type: 'E', path: 'shop.products.1.id', lhs: 2, rhs: 4 },
  { type: 'E', path: 'shop.products.1.name', lhs: 'b', rhs: 'd' },
  { type: 'E', path: 'name', lhs: 'foo', rhs: 'baz' }
]

With match options

var differences = diff(lhs, rhs, { matchKey: 'id' });
 
//The code snippet above would result in the following structure describing the differences:
[
  { type: 'D', path: 'shop.products', lhs: { id: 2, name: 'b' } },
  { type: 'M', path: 'shop.products', item: { id: 3, name: 'c' }, lhsIndex: 2, rhsIndex: 3},
  { type: 'E', path: 'shop.products.3.name', lhs: 'c', rhs: 'cc' },
  { type: 'A', path: 'shop.products.1', rhs: { id: 4, name: 'd' } },
  { type: 'A', path: 'shop.products.2', rhs: { id: 5, name: 'e' } },
  { type: 'E', path: 'name', lhs: 'foo', rhs: 'baz' }
]

With types options

var differences = diff(lhs, rhs, { matchKey: 'id', types:['A','D'] });
 
//The code snippet above would result only added and deleted propery/element in the following structure describing the differences:
[
  { type: 'D', path: 'shop.products', lhs: { id: 2, name: 'b' } },
  { type: 'A', path: 'shop.products.1', rhs: { id: 4, name: 'd' } },
  { type: 'A', path: 'shop.products.2', rhs: { id: 5, name: 'e' } }
]

Function Arguments

  • lhs - the left-hand operand; the origin object.
  • rhs - the right-hand operand; the object being compared structurally with the origin object.
  • options - A configuration object that can have the following properties:
    • matchKey: used to match objects when diffing arrays, by default only === operator is used; string
    • types: calculates differences for given types; array

Differences

Differences are reported as one or more change records. Change records have the following structure:

  • type - indicates the kind of change; will be one of the following:
    • A - indicates a newly added property/element
    • D - indicates a property/element was deleted
    • E - indicates a property/element was edited
    • M - indicates a property/element was moved
  • path - the property/element path
  • item - when type === 'M', contains a nested change record indicating the change that occurred at the array index
  • lhsIndex - when type === 'M', indicates the left-hand-side array index
  • rhsIndex - when type === 'M', indicates the right-hand-side array index
  • lhs - the value on the left-hand-side of the comparison (undefined if kind === 'A')
  • rhs - the value on the right-hand-side of the comparison (undefined if kind === 'D')

Contributing

You discovered a bug or have an idea for a new feature? Great, why don't you send me a PR or open an issue so everyone can benefit from it? If you decide to send PR please run the unit tests before submitting your PR: npm test. Hopefully your PR includes additional unit tests to illustrate your changemodification!

License

MIT

Package Sidebar

Install

npm i nested-object-diff

Weekly Downloads

11,253

Version

1.1.0

License

MIT

Unpacked Size

10.1 kB

Total Files

4

Last publish

Collaborators

  • eraykose