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

댓글

이 블로그의 인기 게시물

Webpack copy-webpack-plugin ignore 사용할 때 주의 점(Important point when using the option "ignore" of the "copy-webpack-plugin")

삼성 Galaxy Gear Circle 사용기

복면가왕 음악을 벅스, 지니 등에서 들으면 드는 생각...