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

JavaScript 객체에 배열의 모든 키가 포함되어 있는지 확인하는 방법

두 개의 인수를 받는 containsAll() 함수를 작성해야 합니다. 첫 번째 인수는 객체(object)이고, 두 번째 인수는 문자열 배열입니다. 이 함수는 객체가 배열에 문자열로 명시된 모든 속성(key)을 포함하고 있는지 여부에 따라 불리언(true/false) 값을 반환합니다.


그럼 코드를 작성해 보겠습니다. 핵심 로직은 간단합니다. 배열을 순회하면서 각 요소가 객체의 키로 존재하는지 하나씩 확인하고, 객체의 키가 아닌 문자열을 발견하면 즉시 반복을 중단하고 false를 반환합니다. 모든 요소가 존재한다면 최종적으로 true를 반환하면 됩니다.


예제 코드

const obj = {
    'name': 'Ashish Kumar','dob': '12/07/1991','gen': 'M','isEmployed': true,'jobType': 'full-time'
};
const obj2 = {
    'name': 'Ashish Kumar','dob': '12/07/1991','gen': 'M','jobType': 'full-time'
};
const arr = ['dob', 'name', 'gen', 'isEmployed', 'jobType'];
const containsAll = (obj, arr) => {
    for(const str of arr){
        if(Object.keys(obj).includes(str)){
            continue;
        }else{
            return false;
        }
    }
    return true;
};
console.log(containsAll(obj, arr));
console.log(containsAll(obj2, arr));

실행 결과

위 코드를 콘솔에서 실행하면 다음과 같은 결과가 출력됩니다.

true
false

코드 동작 원리

첫 번째 객체 obj는 배열 arr에 담긴 모든 키(dob, name, gen, isEmployed, jobType)를 가지고 있으므로 true가 출력됩니다. 반면 두 번째 객체 obj2에는 isEmployed 키가 없기 때문에 순회 도중 false가 반환됩니다.


더 간결한 대안: every() 메서드 활용

for...of 루프 대신 배열의 every() 메서드를 사용하면 같은 기능을 한 줄로 더 선언적으로 구현할 수 있습니다.

const containsAll = (obj, arr) => arr.every(str => Object.keys(obj).includes(str));

every()는 배열의 모든 요소가 주어진 조건을 만족할 때만 true를 반환하므로, 위 함수와 정확히 동일한 결과를 제공하면서도 코드가 훨씬 간결해집니다. 성능이 중요한 경우에는 매번 Object.keys(obj)를 호출하지 않고 미리 키 목록을 변수에 저장해 두는 방식으로 최적화할 수도 있습니다.