javascript 배열 비교, 차집합 교집합 구하는 방법
javascript 배열 차집합, 교집합, 대칭차집합, 합집합 구하는 방법
javascript에서 배열을 다루다 보면 여러 배열에 대한 비교가 필요할 때가 있는데요.
해당 포스팅에서는 'Array.prototype.filter()' 함수와 'Array.prototype.includes()' 함수를 사용하여 두 배열에 대한 차집합(difference set), 교집합(intersction), 대칭차집합(symmetric difference), 합집합(union)을 구하는 방법에 대해서 정리하였습니다.
filter(), includes() 함수
먼저 배열 비교에 핵심이 되는 두 함수에 대해서 간단하게 살펴보겠습니다.
1. Array.prototype.filter()
const fruits = ["apple", "banana", "cherry", "date", "elderberry"];
// 'a'가 포함된 과일만 필터링
const fruitsWithA = fruits.filter(fruit => fruit.includes('a'));
console.log(fruitsWithA); // ["apple", "banana", "date"]
filter() 함수는 배열의 각 요소들 중에서 원하는 조건에 맞는 요소들만 필터링된 배열을 생성하기 위해 사용되며, 동작 원리는 배열의 요소를 순회하면서 콜백 함수를 통해 원하는 조건에 따라 요소를 분리합니다.
(callback 함수의 결과로 true를 반환한 요소만을 모아 새로운 배열로 반환합니다.)
2. Array.prototype.includes()
const fruits = ["apple", "banana", "cherry"];
console.log(fruits.includes("banana")); // true
console.log(fruits.includes("grape")); // false
includes() 함수는 배열이 특정 값을 포함하는지 여부를 확인하는 함수입니다.
주어진 값이 포함되어 있는 경우 true를 반환하고, 포함되지 않은 경우 false를 반환합니다.
(문자열에 대해서는 대소문자를 구분합니다.)
배열 비교
1. 차집합(difference set)
const difference = arr1.filter(x => !arr2.includes(x));
arr1의 요소를 순회하면서 arr2에 해당 요소가 있는지 확인합니다.
arr2.includes(x) 앞에 논리연산자 '!(NOT)'이 붙어있기 때문에 arr1의 요소가 arr2에 포함된 경우 콜백 함수는 false를 반환하고, 포함되지 않은 경우 true를 반환합니다.
즉, arr1 요소들 중 arr2에 포함된 요소가 제외된 요소들이 새로운 배열로 반환됩니다.
const arr1 = ['a', 'b', 'c', 'd', 'e'];
const arr2 = ['b', 'd', 'f'];
console.log(arr1.filter(x => !arr2.includes(x)));
// ['a', 'c', 'e']
2. 교집합(intersection)
const intersection = arr1.filter(x => arr2.includes(x));
arr1의 요소를 순회하면서 arr2에 해당 요소가 있는지 확인합니다.
해당 요소가 arr2에 포함된 경우 true를 반환하고, 포함되지 않은 경우 false를 반환합니다.
결과적으로 arr1의 요소들 중 arr2에도 포함된 요소들만 새로운 배열로 반환됩니다.
const arr1 = ['a', 'b', 'c', 'd', 'e'];
const arr2 = ['b', 'd', 'f'];
console.log(arr1.filter(x => arr2.includes(x)));
// ['b', 'd']
3. 대칭차집합(symmetric difference)
const difference = arr1.filter(x => !arr2.includes(x))
.concat(arr2.filter(x => !arr1.includes(x)));
대칭차집합을 구할 때는 filter(), includes() 함수와 더불어 concat() 함수가 사용되는데요.
'concat()' 함수는 두 개 이상의 배열을 연결하여 새로운 배열을 반환하는 함수입니다.
원리는 차집합의 방식처럼 arr1에서 arr2의 차집합 배열과 arr2에서 arr1의 차집합 배열을 concat() 함수를 통해 합치면 대칭차집합을 구할 수 있습니다.
const arr1 = ['a', 'b', 'c', 'd', 'e'];
const arr2 = ['b', 'd', 'f'];
console.log(arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x))));
// ['a', 'c', 'e', 'f']
// arr1과 arr2의 차집합인 'a', 'c', 'e'
// arr2과 arr1의 차집합인 'f'
4. 합집합(union)
const union = arr1.concat(arr2.filter(x => !arr1.includes(x)));
합집합을 구할 때도 concat() 함수가 사용되는데요.
arr1과 arr2를 concat() 함수를 통해 바로 합쳐버리면 중복되는 값이 들어갈 수 있기 때문에 교집합을 한번 제거하는 과정이 들어가게 됩니다.
const arr1 = ['a', 'b', 'c', 'd', 'e'];
const arr2 = ['b', 'd', 'f'];
console.log(arr1.concat(arr2.filter(x => !arr1.includes(x))));
// ['a', 'b', 'c', 'd', 'e', 'f']