Function Checking For "deep Equality" Of Nested Objects
Solution 1:
Here's one possible solution, but I recommend you find your own, really.
functionisEqual(var1, var2) { // Break the comparison out into a neat little functionif (typeof var1 !== "object") {
return var1===var2;
} else {
returndeepEqual(var1, var2);
}
}
functiondeepEqual(var1, var2) {
for (i in var1) {
if(typeof var2[i] === "undefined") { // Quick check, does the property even exist?returnfalse;
}
if (!isEqual(var1[i], var2[i])) {
returnfalse;
}
}
returntrue;
}
functionareObjectsEqual(obj1, obj2) {
returndeepEqual(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"