jiff
Version:
JSON diff and patch based on rfc6902
59 lines (47 loc) • 1.09 kB
JavaScript
module.exports = deepEquals;
/**
* Compare 2 JSON values, or recursively compare 2 JSON objects or arrays
* @param {object|array|string|number|boolean|null} a
* @param {object|array|string|number|boolean|null} b
* @returns {boolean} true iff a and b are recursively equal
*/
function deepEquals(a, b) {
if(a === b) {
return true;
}
if(Array.isArray(a) && Array.isArray(b)) {
return compareArrays(a, b);
}
if(typeof a === 'object' && typeof b === 'object') {
return compareObjects(a, b);
}
return false;
}
function compareArrays(a, b) {
if(a.length !== b.length) {
return false;
}
for(var i = 0; i<a.length; ++i) {
if(!deepEquals(a[i], b[i])) {
return false;
}
}
return true;
}
function compareObjects(a, b) {
if((a === null && b !== null) || (a !== null && b === null)) {
return false;
}
var akeys = Object.keys(a);
var bkeys = Object.keys(b);
if(akeys.length !== bkeys.length) {
return false;
}
for(var i = 0, k; i<akeys.length; ++i) {
k = akeys[i];
if(!(k in b && deepEquals(a[k], b[k]))) {
return false;
}
}
return true;
}