JS - Set() 💁‍♂️

1. ES2015 中的 JavaScript Set 基础功能

1.1 创建 Set 和去重功能

可以创建一个空的 Set 或通过数组初始化一个 Set,任何重复的值都会被自动移除。

const languages = new Set(["JavaScript", "TypeScript", "HTML", "JavaScript"]);
console.log(languages.size);  // 输出 3,因为 "JavaScript" 是重复的

1.2 添加元素到 Set

使用 add 方法向 Set 添加元素。如果该元素已经存在,Set 大小不会改变。

languages.add("CSS");
languages.add("JavaScript");  // 已存在,不会重复添加
console.log(languages.size);  // 输出 4

1.3 删除元素

可以使用 delete 方法从 Set 中删除元素。

languages.delete("TypeScript");
console.log(languages.size);  // 输出 3

1.4 检查元素是否存在

Set 提供了 has 方法用来检查元素是否存在。

console.log(languages.has("JavaScript"));  // 输出 true
console.log(languages.has("TypeScript"));  // 输出 false

1.5 遍历 Set

可以通过 forEachfor...of 遍历 Set 的所有元素。

languages.forEach(element => console.log(element));
// 输出 "JavaScript", "HTML", "CSS"

1.6 清空 Set

可以使用 clear 方法清空 Set 中的所有元素。

languages.clear();
console.log(languages.size);  // 输出 0

2. 新的 Set 操作方法

在最新的 JavaScript 提案中,Set 增加了常见的集合操作,如并集交集差集对称差集等,这使得 Set 更加完整和实用。

2.1 并集(Set.prototype.union(other)

union 方法返回两个集合的并集,即包含两个集合中所有元素的集合,且每个元素只出现一次。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const allLanguages = frontEndLanguages.union(backEndLanguages);
console.log(allLanguages);  // 输出 Set {"JavaScript", "HTML", "CSS", "Python", "Java"}

这是 SQL 中 FULL OUTER JOIN 的等价操作。

2.2 交集(Set.prototype.intersection(other)

intersection 方法返回两个集合的交集,即同时存在于两个集合中的元素。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const commonLanguages = frontEndLanguages.intersection(backEndLanguages);
console.log(commonLanguages);  // 输出 Set {"JavaScript"}

这是 SQL 中 INNER JOIN 的等价操作。

2.3 差集(Set.prototype.difference(other)

difference 方法返回当前集合中存在但在另一个集合中不存在的元素。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const onlyFrontEnd = frontEndLanguages.difference(backEndLanguages);
console.log(onlyFrontEnd);  // 输出 Set {"HTML", "CSS"}

const onlyBackEnd = backEndLanguages.difference(frontEndLanguages);
console.log(onlyBackEnd);  // 输出 Set {"Python", "Java"}

差集类似于 SQL 中的 LEFT JOIN 操作。

2.4 对称差集(Set.prototype.symmetricDifference(other)

symmetricDifference 返回两个集合中,存在于其中一个集合但不在另一个集合中的所有元素。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const diffLanguages = frontEndLanguages.symmetricDifference(backEndLanguages);
console.log(diffLanguages);  // 输出 Set {"HTML", "CSS", "Python", "Java"}

这类似于 SQL 中 FULL OUTER JOIN,但不包括同时存在于两个集合中的元素。

2.5 子集(Set.prototype.isSubsetOf(other)

isSubsetOf 方法用于判断一个集合是否是另一个集合的子集。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const declarativeLanguages = new Set(["HTML", "CSS"]);

console.log(declarativeLanguages.isSubsetOf(frontEndLanguages));  // 输出 true
console.log(frontEndLanguages.isSubsetOf(declarativeLanguages));  // 输出 false

2.6 超集(Set.prototype.isSupersetOf(other)

isSupersetOf 方法用于判断一个集合是否是另一个集合的超集。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const declarativeLanguages = new Set(["HTML", "CSS"]);

console.log(frontEndLanguages.isSupersetOf(declarativeLanguages));  // 输出 true
console.log(declarativeLanguages.isSupersetOf(frontEndLanguages));  // 输出 false

2.7 不相交集(Set.prototype.isDisjointFrom(other)

isDisjointFrom 方法用于判断两个集合是否没有交集。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const interpretedLanguages = new Set(["JavaScript", "Ruby", "Python"]);
const compiledLanguages = new Set(["Java", "C++", "TypeScript"]);

console.log(interpretedLanguages.isDisjointFrom(compiledLanguages));  // 输出 true
console.log(frontEndLanguages.isDisjointFrom(interpretedLanguages));  // 输出 false

3. 浏览器支持与 Polyfills

这些新的 Set 方法已在 Safari 17 和 Chrome 122 中支持。如果需要支持旧的 JavaScript 引擎,可以使用 Polyfills(如 core-js)来实现这些功能。


Comments

Leave a Comment