随着 JavaScript 的不断发展,越来越多的开发者开始使用它来构建复杂的应用程序。而 hashset 是一种非常常见的数据结构,在 JavaScript 中我们可以使用 Map 或 Set 来模拟其一些功能。但在 ECMAScript 2021 中,提供了新的原生数据结构 —— HashSet
,可以直接使用两个操作符来实现 HashSet,它为 JavaScript 开发者带来了更多便捷的操作方式。
HashSet 的特性
HashSet 是一个类似于数组的数据结构,但是其中的元素没有顺序,且不能重复。它的主要特性包括:
- 元素唯一性: HashSet 中的所有元素都是唯一的,重复元素会被自动过滤。
- 快速查找:利用 hash 算法,可以在 O(1) 的时间复杂度内快速查找某个元素是否在集合中。
- 乱序性: HashSet 中的元素没有任何顺序性,与原数据的输入顺序无关。
HashSet 的操作
在 ECMAScript 2021 中,可以使用两个操作符来实现 HashSet 的操作:
#
:用来访问私有属性,其中包含了内置的add
、has
、delete
等方法。in
:用来查找某个元素是否在集合中。
接下来让我们来看看这几个方法的具体使用方式。
创建 HashSet
在创建 HashSet 时,需要使用 new
运算符,并传入一个可迭代的对象(如数组、Set 等):
const mySet = new HashSet([1, 2, 3]); console.log(mySet); // HashSet {1, 2, 3}
创建空 HashSet:
const mySet = new HashSet(); console.log(mySet); // HashSet {}
添加元素
我们可以使用 add
方法向 HashSet 中添加新的元素:
const mySet = new HashSet(); mySet.#add('a'); mySet.#add('b'); mySet.#add('a'); // 忽略重复元素 console.log(mySet); // HashSet {'a', 'b'}
可以看到,重复的元素会被自动过滤。
查找元素
可以通过使用 in
运算符来判断某个元素是否在 HashSet 中:
const mySet = new HashSet(['a', 'b', 'c']); console.log('a' in mySet); // true console.log('d' in mySet); // false
删除元素
可以使用 delete
方法来删除 HashSet 中的元素:
const mySet = new HashSet([1, 2, 3]); mySet.#delete(3); console.log(mySet); // HashSet {1, 2}
清空 HashSet
可以使用 clear
方法来清空 HashSet 中的所有元素:
const mySet = new HashSet([1, 2, 3]); mySet.#clear(); console.log(mySet); // HashSet {}
示例代码
下面是一个实现 HashSet 的示例代码:
class HashSet { #map = new Map(); constructor(iterable = []) { for (const element of iterable) { this.#add(element); } } #add(element) { if (this.#map.has(element)) { return; } this.#map.set(element, element); } #has(element) { return this.#map.has(element); } #delete(element) { return this.#map.delete(element); } #clear() { this.#map.clear(); } *[Symbol.iterator]() { yield* this.#map.keys(); } }
以上示例代码中,使用了 ES6 的 Map 类作为底层实现,对外使用 Hash 算法来实现 HashSet 的功能。
总结
HashSet 是一种非常有用的数据结构,可以帮助开发者快速实现某些复杂的操作。在 ECMAScript 2021 中,通过引入 HashSet 类,JavaScript 开发者可以更加方便地使用 HashSet,并且以与标准库中的 Set 类类似的方式实现 HashSet。如果你还没有使用过 HashSet,那么现在就是学习它的好时间了!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a7659eadd4f0e0ff0729eb