두 개의 JSON 객체가 있다고 가정해 보겠습니다.
const obj1 = {a: "apple", b: "banana", c: "carrot"};
const obj2 = {a: "apple", e: "egg", b: "banana", c: "carrot", d: "dog"};여기서 우리는 이런 형태의 두 객체를 인자로 받아 비교하는 JavaScript 함수를 작성해야 합니다. 목표는 어느 한쪽 객체에서 데이터를 삭제하지 않은 상태로 두 객체를 비교하여 Boolean(true/false) 값을 얻는 것입니다.
예를 들어 위 데이터의 경우, 두 객체에 공통으로 존재하는 키(a, b, c)의 값이 모두 일치하므로 검사 결과는 true가 되어야 합니다.
반면 obj1은 그대로 둔 채 obj2가 아래와 같다면 어떨까요?
const obj1 = {a: "apple", b: "banana", c: "carrot"};
const obj2 = {a: "ant", e: "egg", b: "banana", c: "carrot", d: "dog"};이번에는 키 'a'의 값이 apple과 ant로 서로 다릅니다. 따라서 나머지 필드가 일치하고 일부 필드가 한쪽에만 존재하더라도 결과는 false가 되어야 합니다. 즉, 공통 키의 값이 하나라도 다르면 false, 모두 같으면 true를 반환하는 것이 핵심입니다.
구현 코드
이를 구현한 코드는 다음과 같습니다.
const obj1 = {
a: "apple",
b: "banana",
c: "carrot"
};
const obj2 = {
a: "apple",
b: "banana",
c: "carrot",
d: "dog",
e: "egg"
};
const obj3 = {a: "apple", b: "banana", c: "carrot"};
const obj4 = {a: "ant", e: "egg", b: "banana", c: "carrot", d: "dog"};
function checkEquality(a, b) {
const entries1 = Object.entries(a);
const entries2 = Object.entries(b);
// 키 개수가 더 적은 객체(짧은 배열)를 기준으로 삼는다
const short = entries1.length > entries2.length ? entries2 : entries1;
const long = short === entries1 ? b : a;
// 짧은 쪽의 모든 [키, 값] 쌍이 긴 쪽 객체의 값과 일치하는지 검사
return short.every(([k, v]) => long[k] === v);
}
console.log(checkEquality(obj1, obj2)); // true
console.log(checkEquality(obj3, obj4)); // false실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true false
코드 동작 원리
- Object.entries(): 객체를 [키, 값] 쌍으로 이루어진 배열로 변환합니다.
- short / long: 키 개수가 더 적은 객체를 기준으로 삼아 그 객체의 키-값 쌍만 검사합니다. 이렇게 하면 한쪽에만 있는 추가 키(d, e 등)는 비교 대상에서 자연스럽게 제외됩니다.
- every(): 기준 객체의 모든 키에 대해 긴 쪽 객체의 값과 일치하는지 확인하며, 하나라도 다르면 즉시 false를 반환합니다.
참고로 이 방식은 얕은(shallow) 비교입니다. 값이 중첩된 객체나 배열인 경우에는 각 값을 재귀적으로 비교하도록 함수를 확장해야 정확한 결과를 얻을 수 있습니다.