Skip to content

Instantly share code, notes, and snippets.

Created February 8, 2018 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save anonymous/660fa11253da78fa1edb9aea02a8979c to your computer and use it in GitHub Desktop.
Save anonymous/660fa11253da78fa1edb9aea02a8979c to your computer and use it in GitHub Desktop.
JS Bin // source https://jsbin.com/macijetaqe
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<script id="jsbin-javascript">
// diff(obj1, obj2);
// {added: ["prop3", "prop4.c"]}
// deleted:["prop1", "prop4.a"],
// modified: ["prop2", "prop4.b"]
var obj1 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: 'b'
}
}
var obj2 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
b: 'v',
c: 'c'
}
}
var obj3 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: {
d: "e"
}
}
}
var obj4 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
q: "added",
b: {
d: "f",
z: "new"
},
c: 'c'
}
}
function buildProps(props) {
return props.join(".");
}
function diff(obj1, obj2) {
var output = {added: [], deleted: [], modified: []};
var properties = [];
function doDiff(obj1, obj2, props) {
for (let prop in obj2) {
if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.added.push(prop);
}
}
for (let prop in obj1) {
if (typeof obj2[prop] === 'object' && obj2[prop] !== null) {
properties.push(prop);
doDiff(obj1[prop], obj2[prop], properties);
properties.pop();
}
if (!obj2[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.deleted.push(prop);
}
if (obj2.hasOwnProperty(prop)) {
if (obj2[prop] !== obj1[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.modified.push(prop);
}
}
}
}
doDiff(obj1, obj2);
console.log(output);
}
// diff(obj1 ,obj2);
diff(obj3 ,obj4);
</script>
<script id="jsbin-source-javascript" type="text/javascript">// diff(obj1, obj2);
// {added: ["prop3", "prop4.c"]}
// deleted:["prop1", "prop4.a"],
// modified: ["prop2", "prop4.b"]
var obj1 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: 'b'
}
}
var obj2 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
b: 'v',
c: 'c'
}
}
var obj3 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: {
d: "e"
}
}
}
var obj4 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
q: "added",
b: {
d: "f",
z: "new"
},
c: 'c'
}
}
function buildProps(props) {
return props.join(".");
}
function diff(obj1, obj2) {
var output = {added: [], deleted: [], modified: []};
var properties = [];
function doDiff(obj1, obj2, props) {
for (let prop in obj2) {
if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.added.push(prop);
}
}
for (let prop in obj1) {
if (typeof obj2[prop] === 'object' && obj2[prop] !== null) {
properties.push(prop);
doDiff(obj1[prop], obj2[prop], properties);
properties.pop();
}
if (!obj2[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.deleted.push(prop);
}
if (obj2.hasOwnProperty(prop)) {
if (obj2[prop] !== obj1[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.modified.push(prop);
}
}
}
}
doDiff(obj1, obj2);
console.log(output);
}
// diff(obj1 ,obj2);
diff(obj3 ,obj4);
</script></body>
</html>
// diff(obj1, obj2);
// {added: ["prop3", "prop4.c"]}
// deleted:["prop1", "prop4.a"],
// modified: ["prop2", "prop4.b"]
var obj1 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: 'b'
}
}
var obj2 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
b: 'v',
c: 'c'
}
}
var obj3 = {
prop1: 'prop1',
prop2: 'prop2',
prop4: {
a: 'a',
b: {
d: "e"
}
}
}
var obj4 = {
prop2: 'prop2 modified',
prop3: 'new prop',
prop4: {
q: "added",
b: {
d: "f",
z: "new"
},
c: 'c'
}
}
function buildProps(props) {
return props.join(".");
}
function diff(obj1, obj2) {
var output = {added: [], deleted: [], modified: []};
var properties = [];
function doDiff(obj1, obj2, props) {
for (let prop in obj2) {
if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.added.push(prop);
}
}
for (let prop in obj1) {
if (typeof obj2[prop] === 'object' && obj2[prop] !== null) {
properties.push(prop);
doDiff(obj1[prop], obj2[prop], properties);
properties.pop();
}
if (!obj2[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.deleted.push(prop);
}
if (obj2.hasOwnProperty(prop)) {
if (obj2[prop] !== obj1[prop]) {
if (props && props.length > 0) {
prop = buildProps(props) + "." + prop;
}
output.modified.push(prop);
}
}
}
}
doDiff(obj1, obj2);
console.log(output);
}
// diff(obj1 ,obj2);
diff(obj3 ,obj4);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment