前言
Set集合是ES6提供的一种新的数据结构,它类似于数组,并且存储的值总是唯一的。Set 对象本身就是一个构造函数,允许你存储任何类型的唯一值,无论是原始值或者是对象引用。Set是由哈希表(Hash Table)实现,并可按添加时候的顺序枚举,速度远快于ES5的object。
一、Set创建方式
注意: Set不允许通过字面量创建,只能通过构造函数的方式创建。
// 创建 set 对象
const set = new Set();
// 创建有初始值的 set 对象
const set = new Set(["稀土","掘金"]);
二、Set的特殊值
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
三、Set对象的API
1. add( value )
作用: 向 Set 添加新元素。
const set = new Set(["稀土","掘金"]);
set.add("VeryCool")
console.log(set); // 输出:{'稀土', '掘金', 'VeryCool'}
2. clear()
作用: 删除 Set 中所有元素,返回undefined。
const set = new Set(["稀土","掘金"]);
set.clear();
console.log(set); // 输出:{size: 0}
3. delete( value )
作用: 删除 Set 中指定的元素。
const set = new Set(["稀土","掘金"]);
set.delete("稀土");
console.log(set); // 输出:{'掘金'}
4. entries()
作用: 返回一个新集合迭代器的对象。该对象包含每个元素的 [value, value] 数组。它维护一个插入顺序。
const set = new Set(["稀土","掘金"]);
const newSet = set.entries();
console.log(newSet); // 输出:{'稀土' => '稀土', '掘金' => '掘金'}
5. has( value )
作用: 查找set集合是否有某个元素,存在返回true,不存在返回false。
const set = new Set(["稀土","掘金"]);
const newSet = set.has("掘金");
console.log(newSet); // 输出:true
6. forEach()
作用: 对Set对象中的每个值执行一次回调函数。
- value:可选,Set对象中元素的值。
- key:可选由于Set对象没有键,所以key的值和value的值相同。
- setObj:可选,Set对象本身。
const set = new Set(["稀土"]);
set.forEach(function (value, key, setObj) {
console.log(value); // 输出:稀土
console.log(key); // 输出:稀土
console.log(setObj); // 输出:{'稀土'}
});
7. keys()、value()
作用: keys()返回Set实例对象的键名遍历器。但由于Set没有键名,只有键值,故keys()方法和values()方法的返回值一样,都是键值。
const set = new Set(["稀土","掘金"]);
const newSet =set.keys();
console.log(newSet); // 输出:{'稀土', '掘金'}
8. size
作用: 返回set集合的元素个数。
const set = new Set(["稀土","掘金"]);
const newSet =set.size;
console.log(newSet); // 输出:2
四、Set对象的作用
1. 数组去重
作用: set集合会自动对数组中重复元素进行去重。
const set = new Set([1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6]);
console.log(set); // 输出:{1, 2, 3, 4, 5, 6}
2. 字符串去重
const set = new Set("稀土掘金稀土掘金");
console.log(set); // 输出:{'稀', '土', '掘', '金'}
3. 求交集
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);
const intersect = new Set([...a].filter((x) => b.has(x))); // {2, 3}
console.log(intersect); // 输出:3
4 求并集
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);
const union = new Set([...a, ...b]);
console.log(union); // 输出:{1, 2, 3, 4, 5}
5.求差集
const a = new Set([1, 2, 3]);
const b = new Set([4, 3, 2]);
const difference = new Set([...a].filter((x) => !b.has(x)));
console.log(difference); // 输出:{1}