This detects the difference between two objects (or revisions):
var A = {A: 10, B: 20, C: 30, D: 90, BB: 5, CC: 4, AA: 2};
var B = { B: 22, C: 30, L: 4, KK: 444, A:15};
var difference = diff(A, B);
console.log(difference);
document.write("<pre>"+JSON.stringify(difference, 0, 3)+"</pre>");
function diff(a, b) {
var result = {removed: "", changed: "", created: "", notChanged: ""};
var str1 = JSON.stringify(a);
str1 = str1.slice(1, str1.length - 1);
var arr1 = str1.split(',');
var str2 = JSON.stringify(b);
str2 = str2.slice(1, str2.length - 1);
var arr2 = str2.split(',');
var keys1 = Object.keys(a);
var keys2 = Object.keys(b);
while (arr1.length || arr2.length) {
var key1 = keys1[0];
var key2 = keys2[0];
var findIndex = keys2.indexOf(key1);
var findIndex2 = keys1.indexOf(key2);
if (findIndex >= 0 && findIndex2 >= 0) {
if (a[key1] == b[keys2[findIndex]]) {
arr2.splice(findIndex, 1);
keys2.splice(findIndex, 1);
keys1.shift();
result.notChanged += (result.notChanged && ", ") + arr1.shift();
} else {
arr1.shift();
keys1.shift();
keys2.splice(findIndex, 1);
result.changed += (result.changed && ", ") + arr2.splice(findIndex, 1);
}
} else {
if (findIndex === -1 && keys1.length) {
keys1.shift();
result.removed += (result.removed && ", ") + arr1.shift();
}
if (findIndex2 === -1 && keys2.length) {
keys2.shift();
result.created += (result.created && ", ") + arr2.shift();
}
}
}
result.removed = JSON.parse("{" + result.removed + "}");
result.notChanged = JSON.parse("{" + result.notChanged + "}");
result.changed = JSON.parse("{" + result.changed + "}");
result.created = JSON.parse("{" + result.created + "}");
return result;
}
Is there anything wrong with my snippet? Do you know of another great way?