Я хотел бы написать функцию на чистом Javascript, функция должна сравнивать 2 объекта и обнаруживать различия. Объекты могут содержать массивы и объекты внутри массивов.
В частности, учитывая 3 объекта, показанных в коде ниже:
- Если я сравниваю firstObject и secondObject, моя функция должна обнаружить, что b.b [1] .b - это «k» вместо «b»
- Если я сравниваю firstObject и thirdObject, моя функция должна обнаружить, что b.a не существует
- Порядок ключей в «object2» не должен иметь значения, однако в массивах это имеет значение (В массивах порядок значений внутри массивов должен быть таким же, как в «object1»)
Что я пытаюсь:
//Recursive function
function compare1(object1, object2) {
Object.keys(object1).forEach(function (k) {
if (typeof object1 !== 'object') {
if (object1[k] != object2[k]){
console.log('Different value found, expected ' + object1[k] + ", found " + object2[k])
}
} else {
compare1(object1[k], object2[k]);
}
});
}
const firstObject = {
a: 1,
b: {
a: 1,
b: [4, { a: "a", b: "b" }, 2],
c: 2
},
c: 2,
d: 3
};
const secondObject = {
a: 1,
b: {
a: 1,
b: [4, { a: "a", b: "n" }, 2],
c: 2
},
c: 2,
d: 3
};
const thirdObject = {
a: 1,
b: {
b: [4, { a: "a", b: "b" }, 2],
c: 2
},
c: 2,
d: 3
};
compare1(firstObject, secondObject);
Этот код печатает:
найдено другое значение, ожидается b, найдено n
Какое поведение ожидается, однако есть 2 вещи, которые я не могу понять
В журнале консоли, показанном выше, я также хотел бы показать положение отличающегося ключа: вместо этого журнал должен быть:
Найдено другое значение, ожидается b, найдено n в b.b [1] .b
Наличие ключа необходимо проверить перед проверкой на равенство, чтобы при запуске:
сравнить1 (первый объект, третий объект);
Консоль должна регистрировать:
Ключ не найден в b.a
Я знаю, что есть библиотеки JS, которые делают глубокое сравнение объектов, однако я хотел бы сделать это в чистом Javascript