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

JavaScript 배열에 여러 값이 모두 포함되어 있는지 확인하는 방법

JavaScript에서 두 개의 숫자 배열을 인자로 받아, 첫 번째 배열의 모든 요소가 두 번째 배열 안에 존재하는지 확인하는 함수를 작성해야 하는 경우가 있습니다. 이 글에서는 map()indexOf()를 활용해 이 문제를 간단하게 해결하는 방법을 알아보겠습니다.

예제 데이터

먼저 아래와 같이 두 개의 배열이 있다고 가정해 보겠습니다.

const arr1 = [34, 78, 89];
const arr2 = [78, 67, 34, 99, 56, 89];

여기서 목표는 arr1의 값 34, 78, 89가 모두 arr2에 포함되어 있는지 검사하는 것입니다.

구현 방법

핵심 아이디어는 다음과 같습니다. 첫 번째 배열의 각 요소를 두 번째 배열에서 찾아 그 인덱스를 새로운 배열로 만들고, 만약 찾지 못한 요소가 하나라도 있다면 해당 위치에는 -1이 저장됩니다. 따라서 결과 배열에 -1이 없는지 확인하면 됩니다.

const arr1 = [34, 78, 89];
const arr2 = [78, 67, 34, 99, 56, 89];

const contains = (first, second) => {
    const indexArray = first.map(el => {
        return second.indexOf(el);
    });
    return indexArray.indexOf(-1) === -1;
}

console.log(contains(arr1, arr2));

코드 설명

contains 함수는 첫 번째 배열(first)의 각 요소에 대해 second.indexOf(el)를 호출합니다. indexOf()는 요소를 찾으면 해당 인덱스를 반환하고, 찾지 못하면 -1을 반환합니다.

그런 다음 indexArray.indexOf(-1) === -1 조건으로 결과 배열에 -1이 존재하는지 확인합니다. 즉, 하나라도 일치하지 않는 요소가 있으면 false, 모든 요소가 포함되어 있으면 true를 반환합니다.

실행 결과

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

true

arr1의 세 값(34, 78, 89)이 모두 arr2에 존재하기 때문에 결과는 true입니다.

참고: includes()를 활용한 대체 방법

ES7(ECMAScript 2016)부터 사용할 수 있는 includes() 메서드를 활용하면 코드를 더욱 직관적으로 작성할 수 있습니다.

const contains = (first, second) => first.every(el => second.includes(el));

console.log(contains(arr1, arr2)); // true

every() 메서드는 배열의 모든 요소가 주어진 조건을 충족하는지 검사하므로, 가독성 측면에서 더 좋은 선택이 될 수 있습니다. 성능이 중요한 대량 데이터 처리 시에는 indexOf()includes()가 O(n)의 시간 복잡도를 가진다는 점을 고려하여, 필요하다면 Set을 활용하는 방식도 검토해 볼 수 있습니다.