Am reading Eloquent javascript and I was given a task to write a deep equal function for objects.
My code works well for object without nested object but when i pass two object that has a nested object in it my code fails.
i tried debugging it and i noticed that anytime the function encounters a nested object, it doesn't transfer control back to the main object.
Take for example i have two object a and b below:
let a = {
name: "ade",
last: "segun",
dead: {
name: "ade",
last: "segun",
},
eaten: true,
};
let b = {
name: "ade",
last: "segun",
dead: {
name: "ade",
last: "segun",
},
eaten: false,
};
After the function checks for the dead property which is a nested object, it doesn't return to the main object and checks for eaten property.
What did I do wrong? This is My code
let a = { name: "ade", last: "segun", dead: { name: "ade", last: "segun", }, eaten: true, };
let b = { name: "ade", last: "segun", dead: { name: "ade", last: "segun", }, eaten: false, };
const deepEqual = (obj1, obj2) => {
const keysA = Object.keys(obj1);
const keysB = Object.keys(obj2);
if (keysA.length !== keysB.length) {
return false;
}
let c;
for (let key of keysA) {
// c checks whether the key is part of keysB array
c = keysB[keysB.indexOf(key)];
if (key !== c) {
return false;
}
if (
typeof obj1[key] === "object" &&
typeof obj2[c] === "object" &&
obj1[key] !== null &&
obj2[c] !== null
) {
return deepEqual(obj1[key], obj2[c]);
} else {
if (obj1[key] !== obj2[c]) return false;
}
}
return true;
};
console.log(deepEqual(a, b)); //true