Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Khi nào nên dùng Set trong JavaScript?

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ơn array.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).