Function Checking For "deep Equality" Of Nested Objects
Solution 1:
Here's one possible solution, but I recommend you find your own, really.
function isEqual(var1, var2) { // Break the comparison out into a neat little function
if (typeof var1 !== "object") {
return var1===var2;
} else {
return deepEqual(var1, var2);
}
}
function deepEqual(var1, var2) {
for (i in var1) {
if(typeof var2[i] === "undefined") { // Quick check, does the property even exist?
return false;
}
if (!isEqual(var1[i], var2[i])) {
return false;
}
}
return true;
}
function areObjectsEqual(obj1, obj2) {
return deepEqual(obj1, obj2) && deepEqual(obj2, obj1); // Two-way checking
}
You not only need to check if everything in obj1 exists in obj2, but also that everything in obj2 exists in obj1. This solution entails doing the comparison both ways, but you could optimize this greatly.
And some test cases
var v1 = { obj0:"jan", obj:{ name:"jan"}, obj2:"ben" }
var v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan2"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben", obj3:"pig" }
console.log(areObjectsEqual(v1, v2))
Solution 2:
What you probably want is _.isEqual from the lodash or underscore library.
There is also the deepEqual test from the Chai.js assertion library.
Solution 3:
A simple solution would be to JSON stringify the objects and compare their string representations. As @Jan mentions ...
this will only work if the objects are initialized in the exact same way. If the properties are the same but in a different order, it will fail
...this is a bit brittle but may suit your purposes.
Post a Comment for "Function Checking For "deep Equality" Of Nested Objects"