Set phù hợp khi bạn cần:
Các trường hợp sử dụng (Use Cases)
- Loại bỏ trùng lặp (Deduplication): Chuyển array → Set → Array:
[...new Set(arr)]. - Kiểm tra thành viên (Membership test) O(1):
set.has(value)nhanh hơnarray.includes(value)O(n). - Phép toán tập hợp (Set operations): Union, Intersection, Difference, Symmetric Difference.
- Unique values theo insertion order: ES6 Set giữ thứ tự thêm vào.
- Filter unique objects by reference: Set so sánh object bằng reference.
Khi KHÔNG nên dùng Set
- Cần truy cập bằng index (
arr[0]) → dùng Array. - Cần duplicate values → dùng Array.
- Cần key-value mapping → dùng Map.
- Cần sort/ordering phức tạp → dùng Array + sort().
- Cần serialize JSON trực tiếp → Set không JSON-serializable (cần
Array.from(set)).
Implement Set Operations (Union, Intersection, Difference)
ES6 Set **không có built-in** union/intersection/difference. Cần tự viết:
// Union (hợp)
function union(setA, setB) {
return new Set([...setA, ...setB]);
}
// Intersection (giao)
function intersection(setA, setB) {
return new Set([...setA].filter(x => setB.has(x)));
}
// Difference (hiệu: A - B)
function difference(setA, setB) {
return new Set([...setA].filter(x => !setB.has(x)));
}
// Symmetric Difference (đối xứng: (A-B) U (B-A))
function symmetricDifference(setA, setB) {
return new Set([
...[...setA].filter(x => !setB.has(x)),
...[...setB].filter(x => !setA.has(x))
]);
}
// Test
const A = new Set([1, 2, 3, 4]);
const B = new Set([3, 4, 5, 6]);
console.log('Union:', union(A, B)); // {1,2,3,4,5,6}
console.log('Intersection:', intersection(A, B)); // {3,4}
console.log('Difference A-B:', difference(A, B)); // {1,2}
console.log('Sym Diff:', symmetricDifference(A, B)); // {1,2,5,6}
Performance
has,add,delete: O(1) average (hash table).- Iteration: O(n).
- Memory: Hơn Array (overhead hash table).