第六章 JavaScript标准库 6.9 Set 类型

81 阅读4分钟

6.9 Set 类型

Set 类型是 ES6(ECMAScript 2015)标准中新增的一种数据结构。这个数据类型也叫集合。集合是一种数学概念,表示一组无序的、唯一的元素。Set 类型实现了这个概念,因为它只包含唯一的值,没有重复的值,而且元素的顺序是不重要的。在数学中,集合有很多基本操作,例如并集、交集、补集等。在 JavaScript 中,Set 类型也提供了一些基本操作,例如添加元素、删除元素、检查元素是否存在等。 下面是一些 Set 类型的基本操作:

  • 1.add(value):向集合中添加一个元素,返回 Set 结构本身。
  • 2.delete(value):从集合中删除一个元素返回一个布尔值,表示删除是否成功。
  • 3.has(value):检查集合中是否存在指定的元素,返回一个布尔值,表示该值是否为 Set 的成员。
  • 4.clear():清空集合中的所有元素,没有返回值。
  • 5.size 属性:返回集合中元素的数量。

Set 构造函数

Set 构造函数用于创建 Set 对象,它可以接受一个可迭代的对象作为参数,用于初始化 Set 对象。 以下是 Set 构造函数的语法: new Set([iterable]) iterable:可迭代对象,它可以是一个数组或者任何实现了迭代器协议的对象。 下面是一个示例,演示如何使用 Set 构造函数创建一个 Set 对象:

const mySet = new Set([1, 2, 3, 3]);
console.log(mySet); // 输出: Set(3) {1, 2, 3}

在这个示例中,我们创建了一个包含重复元素的数组 [1, 2, 3, 3],并将其作为参数传递给了 Set 构造函数。由于 Set 对象只包含唯一的值,因此重复的元素只会出现一次。因此,上述代码将创建一个包含三个元素的 Set 对象 {1, 2, 3}。 如果省略参数,则创建一个空的 Set 对象:

const mySet = new Set();
console.log(mySet); // 输出: Set(0) {}

注意,Set 对象是一个迭代器,因此你可以使用 for...of 循环遍历它的元素。例如:

const mySet = new Set([1, 2, 3]);
for (const element of mySet) {
  console.log(element);
}
// 输出:
// 1
// 2
// 3

Set 的实例方法

以下是一些使用 Set 实例上方法的示例:

const set1 = new Set();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(3); // 这个值不会被添加,因为 Set 只包含唯一的值

console.log(set1.size); // 输出 3

set1.delete(2);
console.log(set1.has(2)); // 输出 false
console.log(set1.size); // 输出 2

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

Set 与数组的相互转换

Set 和数组之间可以相互转换。

1 Set 转换为数组

可以使用 Array.from() 方法将 Set 转换为数组。例如:

const mySet = new Set([1, 2, 3]);
const myArray = Array.from(mySet);
console.log(myArray); // [1, 2, 3]

还可以使用扩展运算符…将 Set 转换为数组。例如:

const mySet = new Set([1, 2, 3]);
const myArray = [...mySet];
console.log(myArray); // [1, 2, 3]

2 数组转换为 Set

可以使用 Set 的构造函数将数组转换为 Set。例如:

const myArray = [1, 2, 3];
const mySet = new Set(myArray);
console.log(mySet); // Set {1, 2, 3}

需要注意的是,如果数组中有重复元素,那么在将其转换为 Set 的过程中,重复元素会被去重。因此,Set 对象中的元素个数可能会小于数组的长度。另外,如果数组中的元素是对象或函数等引用类型,那么在 Set 中保存的是它们的引用,而不是它们的值。这与数组的处理方式是一致的。

遍历 Set

Set 对象提供了三个方法:keys()、values() 和 entries(),用于遍历 Set 中的元素。这三个方法返回的都是一个迭代器对象,可以通过 for...of 循环遍历它们。 keys() 方法返回一个包含 Set 中所有元素键的迭代器,values() 方法返回一个包含 Set 中所有元素值的迭代器, 对于 Set 来说,键和值是相等的,因此 keys() 方法和 values() 方法返回的内容是一样的。entries() 方法返回一个包含 Set 中所有元素键值对的迭代器。对于 Set 来说,键和值是相等的,因此 entries() 方法返回的是一个包含两个相等值的数组。看下边的例子:

const mySet = new Set(['foo', 'bar', 'baz']);
const keys = mySet.keys();

for (const key of keys) {
  console.log(key);
}
// 输出:
// "foo"
// "bar"
// "baz"

const values = mySet.values();

for (const value of values) {
  console.log(value);
}
// 输出:
// "foo"
// "bar"
// "baz"

const iterator = mySet.entries();
for (const entry of iterator) {
  console.log(entry);
}
// 输出:
// ["foo", "foo"]
// ["bar", "bar"]
// ["baz", "baz"]

Set 还提供了一个 forEach() 方法用于对 Set 对象中的每个成员执行一个指定操作,没有返回值。该方法接受一个回调函数作为参数,该回调函数接受三个参数:当前成员的值、当前成员的键名和 Set 对象本身(可选)。

const set = new Set(['a', 'b', 'c']);
set.forEach((value, key, set) => {
  console.log(key + ' : ' + value);
});
// 'a : a'
// 'b : b'
// 'c : c'