중복을 제거하여 교집합 구하기 (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]

댓글

이 블로그의 인기 게시물

Next.js에서 자연스러운 Page Transition 방법

[flutter] Android - Package간 sdk version 등이 맞지 않아 오류가 발생하는 경우

[Windows] Chocolatey upgrade