중첩된 객체를 인자로 받아, 모든 키의 값이 동일한지 여부에 따라 불리언(true/false)을 반환하는 함수(예: isSame())를 작성해야 한다고 가정해 보겠습니다.
여기서 '모든 키'란 최하위 키들을 의미합니다. 즉, 어떤 키의 값이 중첩 객체라면 그 객체의 끝까지 재귀적으로 탐색하여 실제 값을 확인해야 합니다.
문제 이해하기
예를 들어 다음과 같은 객체가 있다고 가정해 봅시다.
const obj = {
a: 1,
b: 1,
c: {
aa: 1
}
};이 경우 모든 최하위 키(a, b, c.aa)가 동일한 값 1을 가지므로 함수는 true를 반환해야 합니다. 반면 하나라도 다른 값이 존재한다면 false를 반환해야 하겠죠. 이제 이 문제를 재귀적으로 해결하는 방법을 살펴보겠습니다.
재귀적 해결 방법
Object.keys()로 객체의 키 목록을 가져온 뒤, 각 키의 값이 객체인 경우 재귀 호출로 더 깊이 들어가고, 그렇지 않으면 기준 값과 비교하는 방식으로 구현할 수 있습니다.
const obj = {
a: 1,
b: 1,
c: {
aa: 3
}
};
const allSame = (obj, value) => {
const keys = Object.keys(obj);
for(let i = 0; i < keys.length; i++){
if(typeof obj[keys[i]] === "object" &&
!Array.isArray(obj[keys[i]])){
return allSame(obj[keys[i]], value);
};
if(!value){
value = obj[keys[i]];
continue;
}
if(obj[keys[i]] !== value){
return false;
};
};
return true;
}
console.log(allSame(obj));
console.log(allSame({ a: 1, b: 1, c: { aa: 1 } }));
console.log(allSame({ a: { x: 1 }, b: 1, c: { aa: 1 } }));
console.log(allSame({ a: 1, b: 1, c: { aa: 2 } }));코드 설명
Object.keys(obj)를 사용해 현재 객체의 모든 키를 배열로 가져옵니다.- 키의 값이 배열이 아닌 객체라면
allSame()을 재귀 호출하여 내부 객체를 계속 탐색합니다. - 아직 기준 값(
value)이 정해지지 않았다면 처음 만난 값을 기준 값으로 삼습니다. - 이후 값들이 기준 값과 다르면 즉시
false를 반환하고, 모든 검사를 통과하면true를 반환합니다.
출력 결과
콘솔 출력 결과는 다음과 같습니다.
false true true false