Đăng ngày

JavaScript Set, Kiến thức Mà Mọi Lập Trình Viên Mới Cần Biết

Tác giả

Tại sao là Set?

Set là một cấu trúc dữ liệu cho phép bạn lưu trữ các giá trị duy nhất của bất kỳ kiểu dữ liệu nào. Nó tương tự như một mảng nhưng không cho phép các giá trị trùng lặp. Đây là một cách tuyệt vời để lưu trữ các giá trị duy nhất của bất kỳ loại nào. Đôi khi bạn muốn lưu trữ các giá trị duy nhất trong một mảng, nhưng bạn không muốn lặp qua mảng để kiểm tra xem giá trị đó đã tồn tại hay chưa. Đó là lúc Set trở nên hữu ích.

Trong một bài viết trước, chúng ta đã thảo luận về Javascript Map. Set tương tự như Map, nhưng nó chỉ lưu trữ các khóa, không phải giá trị. Đây là một cách tuyệt vời để giữ các giá trị duy nhất của bất kỳ kiểu dữ liệu nào. Việc sử dụng Map trong nhiều trường hợp trở nên quá phức tạp. Đó là lý do tại sao chúng ta hãy cùng tìm hiểu về Set.

Set trong JavaScript là gì?

Đối tượng Set là tập hợp các giá trị. Một giá trị trong Set chỉ có thể xuất hiện một lần; nó là duy nhất trong tập hợp của Set. Bạn có thể lặp qua các phần tử của một Set theo thứ tự chèn. Thứ tự chèn tương ứng với thứ tự mà mỗi phần tử được chèn vào Set bằng phương thức add() (nghĩa là, không có phần tử giống hệt nhau đã tồn tại trong Set khi Set gọi add()).

Thông số kỹ thuật yêu cầu các Set được triển khai "sao cho, trung bình, cung cấp thời gian truy cập là dưới tuyến tính trên số lượng phần tử trong tập hợp." Do đó, nó có thể được biểu diễn bên trong dưới dạng bảng băm (với tìm kiếm O(1)), cây tìm kiếm (với tìm kiếm O(log(N))), hoặc bất kỳ cấu trúc dữ liệu nào khác, miễn là độ phức tạp tốt hơn O(N).

Cách tạo một Set?

Có hai cách để tạo một Set. Cách đầu tiên là sử dụng hàm tạo Set. Cách thứ hai là sử dụng ký hiệu đối tượng Set.

Hàm tạo Set

Hàm tạo Set tạo ra một đối tượng Set mới. Bạn có thể truyền một đối tượng có thể lặp lại làm đối số cho hàm tạo. Các phần tử của đối tượng có thể lặp lại sẽ được thêm vào Set mới.

const set = new Set([1, 2, 3, 4, 5])

Ký hiệu đối tượng Set

Ký hiệu đối tượng Set tạo ra một đối tượng Set mới. Bạn có thể truyền một đối tượng có thể lặp lại làm đối số cho ký hiệu đối tượng. Các phần tử của đối tượng có thể lặp lại sẽ được thêm vào Set mới.

const set = {1, 2, 3, 4, 5};

Phương thức & Thuộc tính của Set

Phương thứcMô tả
add()Thêm một phần tử mới với giá trị được chỉ định vào đối tượng Set.
clear()Xóa tất cả các phần tử khỏi đối tượng Set.
delete()Xóa phần tử được liên kết với giá trị và trả về giá trị mà Set.prototype.has(value) đã trả về trước đó. Set.prototype.has(value) sẽ trả về false sau đó.
entries()Trả về một đối tượng Iterator mới chứa một mảng [value, value] cho mỗi phần tử trong đối tượng Set, theo thứ tự chèn.
forEach()Thực hiện một hàm được cung cấp một lần cho mỗi giá trị trong đối tượng Set, theo thứ tự chèn.
has()Trả về một giá trị boolean xác nhận xem một phần tử có tồn tại với giá trị đã cho trong đối tượng Set hay không.
keys()Trả về một đối tượng Iterator mới chứa các giá trị cho mỗi phần tử trong đối tượng Set theo thứ tự chèn.
values()Trả về một đối tượng Iterator mới chứa các giá trị cho mỗi phần tử trong đối tượng Set theo thứ tự chèn.
Thuộc tínhMô tả
sizeTrả về số lượng giá trị trong đối tượng Set.

Ví dụ về Set

Thêm một giá trị vào Set

const set = new Set([1, 2, 3, 4, 5])
set.add(6)
console.log(Set) // Set { 1, 2, 3, 4, 5, 6 }

Xóa một giá trị khỏi Set

const set = new Set([1, 2, 3, 4, 5])
set.delete(3)
console.log(set) // Set { 1, 2, 4, 5 }

Kiểm tra xem một giá trị có tồn tại trong Set hay không

const set = new Set([1, 2, 3, 4, 5])
console.log(set.has(3)) // true

Lặp qua Set

const set = new Set([1, 2, 3, 4, 5])
for (const item of Set) {
  console.log(item)
}
// 1
// 2
// 3
// 4
// 5

Chuyển đổi Set sang mảng

const set = new Set([1, 2, 3, 4, 5])
const array = Array.from(set)
console.log(array) // [1, 2, 3, 4, 5]

Chuyển đổi mảng sang Set

const Array = [1, 2, 3, 4, 5]
const set = new Set(array)
console.log(Set) // Set { 1, 2, 3, 4, 5 }

Lấy kích thước của Set

const set = new Set([1, 2, 3, 4, 5])
console.log(set.size) // 5

Xóa Set

const set = new Set([1, 2, 3, 4, 5])
set.clear()
console.log(set) // Set {}

Hợp nhất Set

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([6, 7, 8, 9, 10])
const set3 = new Set([...set1, ...set2])
console.log(set3) // Set { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }

Lấy giao của hai Set

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5, 6, 7, 8])
const set3 = new Set([...set1].filter((x) => set2.has(x)))
console.log(set3) // Set { 4, 5 }

Lấy hiệu của hai Set

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5, 6, 7, 8])
const set3 = new Set([...set1].filter((x) => !set2.has(x)))
console.log(set3) // Set { 1, 2, 3 }

Kiểm tra xem Set có là tập con của một Set khác hay không

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5])
console.log([...set2].every((x) => set1.has(x))) // true

Kiểm tra xem Set có là tập siêu của một Set khác hay không

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([4, 5])
console.log([...set1].every((x) => set2.has(x))) // false

Kiểm tra xem hai Set có giao nhau hay không

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([6, 7, 8, 9, 10])
console.log([...set1].every((x) => !set2.has(x))) // true

Kiểm tra xem hai Set có bằng nhau hay không

const set1 = new Set([1, 2, 3, 4, 5])
const set2 = new Set([1, 2, 3, 4, 5])
console.log(set1.size === set2.size && [...set1].every((x) => set2.has(x))) // true

Hỗ trợ trình duyệt

ChromeChromeFirefoxFirefoxEdgeEdgeSafariSafariOperaOpera
49+44+12+10.1+36+

Set vs. Mảng

SetMảng
Giá trị duy nhất, không cho phép giá trị trùng lặpCho phép giá trị trùng lặp
Set là một tập hợp các giá trị không có thứ tự cụ thểMảng là một tập hợp các giá trị có thứ tự cụ thể
Set có thể lặp lạiMảng có thể lặp lại
Set chậm hơn mảng trong quá trình khởi tạo vì nó sử dụng quá trình băm.Mảng nhanh hơn về mặt khởi tạo
Hiệu suất tốt hơn khi kiểm tra sự tồn tại của một phần tửHiệu suất tốt hơn khi truy cập một phần tử

Bài viết này được xuất bản lần đầu trên blog.imam.dev.

Tài liệu tham khảo

  1. Mozilla Developer Network - Set

  2. W3Schools - Set

  3. ECMAScript® 2015 Language Specification - Set