Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 객체의 모든 속성값이 동일한지 재귀적으로 확인하는 방법

중첩된 객체를 인자로 받아, 모든 키의 값이 동일한지 여부에 따라 불리언(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