Skip to content

Commit 95d5a52

Browse files
okaiokai
authored andcommitted
docs(blog): SEO 기술 팁 포스트 추가 - JavaScript Set intersection/union/difference (3개 언어)
1 parent a4bb918 commit 95d5a52

3 files changed

Lines changed: 299 additions & 0 deletions
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
layout: post
3+
title: "JavaScript Set New Methods - intersection, union, difference Practical Guide"
4+
date: 2026-03-22 09:00:00 +0900
5+
categories: [Development, Tips]
6+
tags: [JavaScript, Set, intersection, union, difference, ES2025]
7+
author: "Kevin Park"
8+
lang: en
9+
excerpt: "JavaScript Set finally gets intersection, union, difference, and symmetricDifference methods. Native set operations without filter + includes hacks."
10+
---
11+
12+
## Problem
13+
14+
Finding common elements, merging, or computing differences between two arrays used to require clunky `filter` + `includes` combinations.
15+
16+
```javascript
17+
// The old way - verbose and slow
18+
const common = arr1.filter(x => arr2.includes(x));
19+
const merged = [...new Set([...arr1, ...arr2])];
20+
const diff = arr1.filter(x => !arr2.includes(x));
21+
```
22+
23+
Since `includes` does an O(n) scan each time, the overall complexity is O(n²). It doesn't scale.
24+
25+
## Solution
26+
27+
Use the new Set composition methods. They shipped in all major browsers in 2024 and are available in Node.js 22+.
28+
29+
```javascript
30+
const frontend = new Set(['React', 'Vue', 'Svelte', 'Angular']);
31+
const liked = new Set(['React', 'Svelte', 'Rust', 'Go']);
32+
33+
// Intersection - elements in both
34+
frontend.intersection(liked);
35+
// Set {'React', 'Svelte'}
36+
37+
// Union - all elements combined
38+
frontend.union(liked);
39+
// Set {'React', 'Vue', 'Svelte', 'Angular', 'Rust', 'Go'}
40+
41+
// Difference - only in frontend
42+
frontend.difference(liked);
43+
// Set {'Vue', 'Angular'}
44+
45+
// Symmetric difference - in one but not both
46+
frontend.symmetricDifference(liked);
47+
// Set {'Vue', 'Angular', 'Rust', 'Go'}
48+
```
49+
50+
There are also comparison methods:
51+
52+
```javascript
53+
const all = new Set([1, 2, 3, 4, 5]);
54+
const sub = new Set([2, 3]);
55+
const other = new Set([6, 7]);
56+
57+
sub.isSubsetOf(all); // true
58+
all.isSupersetOf(sub); // true
59+
all.isDisjointFrom(other); // true
60+
```
61+
62+
## Practical Patterns
63+
64+
Permission checking becomes much cleaner:
65+
66+
```javascript
67+
function hasRequiredPermissions(userPerms, requiredPerms) {
68+
const user = new Set(userPerms);
69+
const required = new Set(requiredPerms);
70+
return required.isSubsetOf(user);
71+
}
72+
73+
const myPerms = ['read', 'write', 'delete'];
74+
const needed = ['read', 'write'];
75+
76+
hasRequiredPermissions(myPerms, needed); // true
77+
```
78+
79+
Tag filtering is also straightforward:
80+
81+
```javascript
82+
const selectedTags = new Set(['JavaScript', 'TypeScript']);
83+
const postTags = new Set(['JavaScript', 'React', 'Node.js']);
84+
85+
selectedTags.intersection(postTags).size > 0; // true
86+
```
87+
88+
## Key Points
89+
90+
- Four core methods: `intersection`, `union`, `difference`, `symmetricDifference`
91+
- All return a new Set without mutating the original (immutable)
92+
- Hash-based O(n) internally — significantly faster than `filter` + `includes`
93+
- Supported in Node.js 22+, Chrome 122+, Safari 17+, Firefox 127+
94+
- `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` for set relationship checks
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
layout: post
3+
title: "JavaScript Setの新メソッド完全ガイド - intersection, union, differenceの実践活用"
4+
date: 2026-03-22 09:00:00 +0900
5+
categories: [Development, Tips]
6+
tags: [JavaScript, Set, intersection, union, difference, ES2025]
7+
author: "Kevin Park"
8+
lang: ja
9+
excerpt: "JavaScript Setにintersection、union、differenceメソッドが追加されました。filterとincludesの組み合わせから卒業し、ネイティブの集合演算を活用する方法をご紹介します。"
10+
---
11+
12+
## 問題
13+
14+
2つの配列から共通要素を抽出したり、結合したり、差分を求める場面は頻繁にあります。
15+
従来は`filter` + `includes`の組み合わせで処理していましたが、コードが冗長で性能も良くありませんでした。
16+
17+
```javascript
18+
// 従来の方法 - 冗長で遅い
19+
const common = arr1.filter(x => arr2.includes(x));
20+
const merged = [...new Set([...arr1, ...arr2])];
21+
const diff = arr1.filter(x => !arr2.includes(x));
22+
```
23+
24+
`includes`が毎回O(n)の探索を行うため、全体的にO(n²)になります。
25+
データが大きくなると明らかに遅くなります。
26+
27+
## 解決方法
28+
29+
Setに新しく追加された集合演算メソッドを使います。
30+
2024年に主要ブラウザすべてでサポートが完了し、Node.js 22以降で利用可能です。
31+
32+
```javascript
33+
const frontend = new Set(['React', 'Vue', 'Svelte', 'Angular']);
34+
const liked = new Set(['React', 'Svelte', 'Rust', 'Go']);
35+
36+
// 積集合 - 両方に含まれるもの
37+
frontend.intersection(liked);
38+
// Set {'React', 'Svelte'}
39+
40+
// 和集合 - すべてを結合
41+
frontend.union(liked);
42+
// Set {'React', 'Vue', 'Svelte', 'Angular', 'Rust', 'Go'}
43+
44+
// 差集合 - frontendにだけあるもの
45+
frontend.difference(liked);
46+
// Set {'Vue', 'Angular'}
47+
48+
// 対称差集合 - 片方にだけあるもの
49+
frontend.symmetricDifference(liked);
50+
// Set {'Vue', 'Angular', 'Rust', 'Go'}
51+
```
52+
53+
比較メソッドも用意されています。
54+
55+
```javascript
56+
const all = new Set([1, 2, 3, 4, 5]);
57+
const sub = new Set([2, 3]);
58+
const other = new Set([6, 7]);
59+
60+
// 部分集合の確認
61+
sub.isSubsetOf(all); // true
62+
63+
// 上位集合の確認
64+
all.isSupersetOf(sub); // true
65+
66+
// 互いに素の確認(共通要素なし)
67+
all.isDisjointFrom(other); // true
68+
```
69+
70+
## 実践的なパターン
71+
72+
権限チェックなどですぐに活用できます。
73+
74+
```javascript
75+
function hasRequiredPermissions(userPerms, requiredPerms) {
76+
const user = new Set(userPerms);
77+
const required = new Set(requiredPerms);
78+
return required.isSubsetOf(user);
79+
}
80+
81+
const myPerms = ['read', 'write', 'delete'];
82+
const needed = ['read', 'write'];
83+
84+
hasRequiredPermissions(myPerms, needed); // true
85+
```
86+
87+
タグフィルタリングもシンプルになります。
88+
89+
```javascript
90+
const selectedTags = new Set(['JavaScript', 'TypeScript']);
91+
const postTags = new Set(['JavaScript', 'React', 'Node.js']);
92+
93+
selectedTags.intersection(postTags).size > 0; // true
94+
```
95+
96+
## ポイント
97+
98+
- `intersection``union``difference``symmetricDifference`の4つが核心です
99+
- 元のSetを変更せず、新しいSetを返します(イミュータブル)
100+
- `filter` + `includes`よりも高速 - 内部的にハッシュベースのO(n)処理
101+
- Node.js 22+、Chrome 122+、Safari 17+、Firefox 127+でサポート
102+
- `isSubsetOf``isSupersetOf``isDisjointFrom`で集合の関係も確認可能
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
---
2+
layout: post
3+
title: "JavaScript Set 새 메서드 총정리 - intersection, union, difference 실전 활용"
4+
date: 2026-03-22 09:00:00 +0900
5+
categories: [Development, Tips]
6+
tags: [JavaScript, Set, intersection, union, difference, ES2025]
7+
author: "Kevin Park"
8+
lang: ko
9+
excerpt: "JavaScript Set에 드디어 intersection, union, difference 메서드가 추가됐다. 배열 중복 제거를 넘어서 집합 연산을 네이티브로 처리하는 방법 정리."
10+
---
11+
12+
## 문제
13+
14+
배열 두 개에서 공통 요소를 뽑거나, 합치거나, 차이를 구해야 하는 상황.
15+
매번 `filter` + `includes` 조합으로 처리했는데 코드가 지저분하고 성능도 별로였다.
16+
17+
```javascript
18+
// 예전 방식 - 읽기도 귀찮다
19+
const common = arr1.filter(x => arr2.includes(x));
20+
const merged = [...new Set([...arr1, ...arr2])];
21+
const diff = arr1.filter(x => !arr2.includes(x));
22+
```
23+
24+
`includes`가 매번 O(n) 탐색을 하니까 전체적으로 O(n²)인 거다.
25+
데이터가 좀만 커져도 느려진다.
26+
27+
## 해결
28+
29+
Set에 새로 추가된 집합 연산 메서드를 쓰면 된다.
30+
2024년에 모든 주요 브라우저에서 지원이 완료됐고, Node.js 22부터 사용 가능하다.
31+
32+
```javascript
33+
const frontend = new Set(['React', 'Vue', 'Svelte', 'Angular']);
34+
const liked = new Set(['React', 'Svelte', 'Rust', 'Go']);
35+
36+
// 교집합 - 둘 다 포함된 것
37+
frontend.intersection(liked);
38+
// Set {'React', 'Svelte'}
39+
40+
// 합집합 - 전부 합치기
41+
frontend.union(liked);
42+
// Set {'React', 'Vue', 'Svelte', 'Angular', 'Rust', 'Go'}
43+
44+
// 차집합 - frontend에만 있는 것
45+
frontend.difference(liked);
46+
// Set {'Vue', 'Angular'}
47+
48+
// 대칭차집합 - 한쪽에만 있는 것
49+
frontend.symmetricDifference(liked);
50+
// Set {'Vue', 'Angular', 'Rust', 'Go'}
51+
```
52+
53+
비교 메서드도 있다.
54+
55+
```javascript
56+
const all = new Set([1, 2, 3, 4, 5]);
57+
const sub = new Set([2, 3]);
58+
const other = new Set([6, 7]);
59+
60+
// 부분집합 확인
61+
sub.isSubsetOf(all); // true
62+
63+
// 상위집합 확인
64+
all.isSupersetOf(sub); // true
65+
66+
// 서로소 확인 (공통 요소 없음)
67+
all.isDisjointFrom(other); // true
68+
```
69+
70+
## 실전에서 쓸만한 패턴
71+
72+
권한 체크 같은 데서 바로 써먹을 수 있다.
73+
74+
```javascript
75+
function hasRequiredPermissions(userPerms, requiredPerms) {
76+
const user = new Set(userPerms);
77+
const required = new Set(requiredPerms);
78+
return required.isSubsetOf(user);
79+
}
80+
81+
const myPerms = ['read', 'write', 'delete'];
82+
const needed = ['read', 'write'];
83+
84+
hasRequiredPermissions(myPerms, needed); // true
85+
```
86+
87+
태그 필터링도 깔끔해진다.
88+
89+
```javascript
90+
const selectedTags = new Set(['JavaScript', 'TypeScript']);
91+
const postTags = new Set(['JavaScript', 'React', 'Node.js']);
92+
93+
// 선택한 태그 중 하나라도 포함되어 있는지
94+
selectedTags.intersection(postTags).size > 0; // true
95+
```
96+
97+
## 핵심 포인트
98+
99+
- `intersection`, `union`, `difference`, `symmetricDifference` 4개가 핵심이다
100+
- 원본 Set을 변경하지 않고 새 Set을 반환한다 (immutable)
101+
- `filter` + `includes` 조합보다 성능이 훨씬 좋다 - 내부적으로 해시 기반 O(n) 처리
102+
- Node.js 22+, Chrome 122+, Safari 17+, Firefox 127+에서 지원
103+
- `isSubsetOf`, `isSupersetOf`, `isDisjointFrom`으로 집합 관계도 확인 가능

0 commit comments

Comments
 (0)