Các bộ hiện có sẵn trong ES2015 (hay còn gọi là ES6, tức là ECMAScript 6). ES6 là tiêu chuẩn hiện tại cho JavaScript kể từ tháng 6 năm 2015.
ECMAScript 6 có cấu trúc dữ liệu Set hoạt động với các giá trị tùy ý, nhanh và xử lý NaN một cách chính xác. - Axel Rauschmayer , Khám phá ES6
Hai ví dụ đầu tiên từ Axel Rauschmayer của cuốn sách Khám phá ES6 :
Quản lý các yếu tố đơn lẻ:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Xác định kích thước của một Tập hợp và xóa nó:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
Tôi sẽ xem Khám phá ES6 nếu bạn muốn tìm hiểu thêm về Bộ trong JavaScript. Cuốn sách được đọc trực tuyến miễn phí, nhưng nếu bạn muốn ủng hộ tác giả Tiến sĩ Axel Rauschmayer, bạn có thể mua cuốn sách với giá khoảng 30 đô la.
Nếu bạn muốn sử dụng Sets và ES6 bây giờ, bạn có thể sử dụng Babel , bộ chuyển tiếp ES6 đến ES5 và các polyfills của nó.
Chỉnh sửa: Kể từ ngày 6 tháng 6 năm 2017, hầu hết các trình duyệt chính đều có hỗ trợ Bộ hoàn chỉnh trong các phiên bản mới nhất của chúng (ngoại trừ IE 11). Điều này có nghĩa là bạn có thể không cần babel nếu bạn không muốn hỗ trợ các trình duyệt cũ hơn. Nếu bạn muốn xem khả năng tương thích trong các trình duyệt khác nhau bao gồm cả trình duyệt hiện tại của bạn, hãy kiểm tra bảng tương thích ES6 của Kangax .
BIÊN TẬP:
Chỉ cần làm rõ về khởi tạo. Các tập hợp có thể nhận bất kỳ khả năng lặp đồng bộ nào trong phương thức khởi tạo của chúng. Điều này có nghĩa là họ có thể lấy không chỉ mảng mà còn cả chuỗi và trình vòng lặp. Lấy ví dụ về khởi tạo mảng và chuỗi sau của một tập hợp:
const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);
Cả hai đầu ra của mảng và chuỗi đều giống nhau. Lưu ý rằng đó ...set1
là cú pháp lây lan . Có vẻ như mỗi phần tử của có thể lặp lại được thêm từng phần tử một vào tập hợp, do đó, cả mảng và chuỗi đều có các phần tử giống nhau và vì các phần tử có cùng thứ tự nên tập hợp được tạo giống nhau. Một điều khác cần lưu ý về tập hợp là khi lặp lại chúng, thứ tự lặp tuân theo thứ tự mà các phần tử đã được chèn vào tập hợp. Đây là một ví dụ về việc lặp lại trên một tập hợp:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
Vì bạn có thể sử dụng bất kỳ tệp nào có thể lặp lại để khởi tạo một tập hợp, bạn thậm chí có thể sử dụng một trình lặp từ một hàm trình tạo . Dưới đây là hai ví dụ về khởi tạo trình lặp tạo ra cùng một đầu ra:
function* getLetters1 () {
yield 'a';
yield 'a';
yield 'b';
yield 'b';
yield 'c';
yield 'c';
}
function* getLetters2 (letters, repeatTimes) {
for(const letter of letters) {
for(let i = 0; i < repeatTimes; ++i) {
yield letter;
}
}
}
console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);
console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);
Các hàm trình tạo của các ví dụ này chỉ có thể được viết để không lặp lại, nhưng nếu hàm trình tạo phức tạp hơn và miễn là điều sau không ảnh hưởng quá tiêu cực đến hiệu suất, bạn có thể sử dụng phương pháp Đặt để giúp chỉ nhận các giá trị từ trình tạo không không lặp lại.
Nếu bạn muốn biết thêm về các bộ mà không cần đọc chương sách của Tiến sĩ Rauschmayer, bạn có thể xem các tài liệu MDN trên Set . MDN cũng có nhiều ví dụ về iterating qua một bộ như sử dụng forEach
và sử dụng .keys
, .values
và .entries
phương pháp. MDN cũng có các ví dụ như tập hợp liên hiệp, giao điểm tập hợp, chênh lệch tập hợp, chênh lệch tập hợp đối xứng và kiểm tra tập hợp siêu hạng. Hy vọng rằng hầu hết các hoạt động đó sẽ có sẵn trong JavaScript mà không cần phải xây dựng các hàm của riêng bạn hỗ trợ chúng. Trên thực tế, có đề xuất TC39 này cho các phương pháp Đặt mới , hy vọng sẽ thêm các phương pháp sau vào Đặt trong JavaScript vào một thời điểm nào đó trong tương lai nếu đề xuất đạt đến giai đoạn 4:
- Set.prototype.intersection (có thể lặp lại) - phương thức tạo phiên bản Set mới bằng thao tác đặt giao điểm.
- Set.prototype.union (có thể lặp lại) - phương thức tạo cá thể Set mới bằng hoạt động liên hiệp thiết lập.
- Set.prototype.difference (có thể lặp lại) - phương thức tạo Tập hợp mới mà không có phần tử hiện diện trong có thể lặp lại.
- Set.prototype.symmetricDifference (có thể lặp lại) - trả về Tập hợp các phần tử chỉ được tìm thấy trong điều này hoặc trong có thể lặp lại.
- Set.prototype.isSubsetOf (có thể lặp lại)
- Set.prototype.isDisjointFrom (có thể lặp lại)
- Set.prototype.isSupersetOf (có thể lặp lại)
'Tom' in set
trông như thế nào? Có vẻ như bạn đã giả định sai về điều gì đó và tôi đang cố gắng tìm hiểu về điều đó .