중복을 제거하여 교집합 구하기 (Intersection of arrays with duplicate values)
중복을 제거하여 교집합 구하기 (Intersection of arrays with duplicate values)
단순화
const source1 = [1, 2, 3, 4, 5, 7];
const source2 = [2, 3, 4];
source1.filter(value => source2.indexOf(value) !== -1);
=> [2, 3, 4]
단순화의 한계: 중복이 있는 경우, 황당한 결과를 전달하게 된다.
const source1 = [1, 2, 3, 2, 4, 5, 3, 3, 7];
const source2 = [2, 3, 2, 4, 5, 3];
source1.filter(value => source2.indexOf(value) !== -1);
=> [2, 3, 2, 4, 5, 3, 3]
단순화 개선 버전 (ES6 "Set" 필요)
const source1 = [1, 2, 3, 2, 4, 5, 3, 3, 7];
const source2 = [2, 3, 2, 4, 5, 3];
// pattern #1
const setSource2 = new Set(source2);
const source3 = [...new Set(source1.filter(value => setSource2.has(value)))];
// pattern #2
const source3 = [...new Set(source1.filter(value => (source2.findIndex(value2 => (value === value2)) > -1)))]
=> [2, 3, 4, 5]
참고 (StackOverflow)
- [...new Set()]는 Array.from(new Set()) 와 동일하다.
- Class "Set"는 입력된 요소를 유일한 값만 추려서 가지고 있게 된다.
- new Set([1, 2, 2, 3]) => {1, 2, 3}
단순화 개선 버전 (ES6 "Set"을 지원하지 않는 경우)
const source1 = [1, 2, 3, 2, 4, 5, 3, 3, 7];
const source2 = [2, 3, 2, 4, 5, 3];
const source3 = source1.filter(value => (source2.indexOf(value) !== -1))
.filter((value, index, self) => (self.indexOf(value) === index));
=> [2, 3, 4, 5]
댓글
댓글 쓰기