Вопрос (от Eloquent Javascript 2nd Edition, глава 4, упражнение 4):
Напишите функцию deepEqual, которая принимает два значения и возвращает true, только если они являются одним и тем же значением или являются объектами с теми же свойствами, значения которых также равный по сравнению с рекурсивным вызовом deepEqual.
Тестовые случаи:
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
Мой код:
var deepEqual = function (x, y) {
if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
if (Object.keys(x).length != Object.keys(y).length)
return false;
for (var prop in x) {
if (y.hasOwnProperty(prop))
return deepEqual(x[prop], y[prop]);
/*This is most likely where my error is. The question states that all the values
should be checked via recursion; however, with the current setup, only the first
set of properties will be checked. It passes the test cases, but I would like
to solve the problem correctly!*/
}
}
else if (x !== y)
return false;
else
return true;
}
Я думаю, что у меня есть общая идея; однако, как я уже сказал в комментарии, программа не проверит второе свойство в объектах. Я чувствую, что у меня есть структурно-логическая проблема, и я просто использую рекурсию не так, как я изначально собирался перебирать свойства, использовать рекурсию для сравнения значений первого свойства, а затем продолжить в цикле до следующего собственности и сравнить снова. Хотя, я не уверен, что это возможно?
Я дал много размышлений и попробовал несколько разных подходов, но это был самый правильный ответ, который я до сих пор пришел. Любые возможные подсказки, чтобы указать мне в правильном направлении?