Set 是 ES6 中新增的一种数据类型,它类似于数组,但是成员的值都是唯一的,没有重复的值。ES7 对 Set 做了一些增强,本文将详细介绍 Set 的常用方法和用法,以及相比于数组的优势。
Set 的基本用法
创建 Set
通过 new Set()
可以创建一个空的 Set:
const set = new Set(); // 空的 Set
也可以传入一个数组(或类数组对象)来初始化 Set:
const set = new Set([1, 2, 3]); console.log(set); // Set { 1, 2, 3 }
注意,如果数组中有重复的元素,Set 会自动去重:
const set = new Set([1, 2, 2, 3, 3, 3]); console.log(set); // Set { 1, 2, 3 }
Set 的常用方法
Set 的常用方法主要有以下几个:
add(value)
:向 Set 中添加一个值,返回 Set 本身。delete(value)
:从 Set 中删除一个值,返回一个布尔值表示是否删除成功。has(value)
:判断 Set 是否包含某个值,返回一个布尔值。clear()
:清空 Set 中的所有值,没有返回值。forEach(callbackFn, thisArg?)
:遍历 Set 中的每个值,并使用回调函数处理,可以有第二个参数指定回调函数中的this
对象。
const set = new Set([1, 2, 3]); set.add(4); // Set { 1, 2, 3, 4 } set.delete(3); // true set.has(2); // true set.has(3); // false set.clear(); // Set {}
Set 的优势
相比于数组,Set 的优势有以下几个:
- 去重:Set 自动去重,使得代码更简洁高效。
- 高效的查找:Set 中可以使用
has
方法来判断是否包含某个值,时间复杂度为 O(1),而数组的indexOf
方法时间复杂度最差为 O(n)。 - 更加语义化的集合操作:Set 支持交集、并集、差集等常见的集合操作。
Set 与数组的相互转换
将 Set 转换为数组
可以使用 Array.from 或展开运算符(...)将 Set 转换为数组:
const set = new Set([1, 2, 3]); const arr1 = Array.from(set); const arr2 = [...set]; console.log(arr1); // [1, 2, 3] console.log(arr2); // [1, 2, 3]
将数组转换为 Set
可以直接使用数组初始化 Set:
const arr = [1, 2, 3]; const set = new Set(arr); console.log(set); // Set { 1, 2, 3 }
Set 实际应用
数组去重
Set 可以轻松地实现数组去重:
const arr = [1, 2, 2, 3, 3, 3]; const dedupedArr = [...new Set(arr)]; console.log(dedupedArr); // [1, 2, 3]
判断两个数组是否有交集
Set 可以轻松地判断两个数组是否有交集:
const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; const set1 = new Set(arr1); const hasIntersection = arr2.some((item) => set1.has(item)); console.log(hasIntersection); // true
数组的并集和差集
使用 Set 可以更加语义化地实现数组的并集和差集:
const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; const set1 = new Set(arr1); const set2 = new Set(arr2); const union = new Set([...set1, ...set2]); const difference = new Set([...set1].filter((x) => !set2.has(x))); console.log(union); // Set { 1, 2, 3, 4, 5 } console.log(difference); // Set { 1, 2 }
总结
本文介绍了 ES7 中新增的数据类型 Set,包括基本用法和常用方法,并展示了 Set 相较于数组的优势以及实际应用。Set 在实际开发中会更加简洁高效,更具语义化。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654f32c47d4982a6eb82f34b