Добрый день.
Нужна помощь.
Нужно написать функцию глубокого сравнения. Сравниваться должны значения всех типов и любой уровень вложенности, написана на ЕS5. Могу использовать только рекурсию.
Мы не даем готовых ответов. А помогаем разобраться и научиться. В чем затык? Что уже пробовал сделать? Пока код который есть
function checkObject(obj1, obj2) {
if(typeof obj1 == typeof obj1) {
if(typeof obj1 == "object" && obj1 != null) {
var equal = true;
for(var key in obj1) {
if(obj1.hasOwnProperty(key) && obj2.hasOwnProperty(key)) {
if(!checkObject(obj1[key], obj2[key])) {
equal = false;
}
} else {
equal = false;
}
}
return equal;
} else {
return obj1 === obj2;
}
} else {
return false;
}
}
//Проверка:
var obj = {these: {name: 'Vasya', boolean: true}, object: 2};
console.log(checkObject(obj, obj));
console.log(checkObject(obj, {these: 10, object: 20, object2: 4}));
console.log(checkObject(obj, {these: {name: 'Vasya', boolean: true}, object: 2}));
//Мне не хватает проверки массива.
Верное направление мышления. Спасибо что поделился прогрессом.
Ты разобрался с вопросом или еще что-то осталось неясным?
Проверку на массив добавить надо))) не знаю как)
function isArray(val) {
return Object.prototype.toString.call(val) === '[object Array]'
}
Реализация выглядет странно. Но это издревле работающий прием для определения типа объекта. В es5.1 еще есть статический метод класса Array.isArray
.
Один из главных недостатков большинства реализаций — это отсутствие проверки объектов на цикличность. Иначе рекурсия закончится ошибкой.