ES6 提供了一个新的数据结构 Set,它和 Array 的结构很类似,但是 Set 中成员的值都是唯一的,没有重复的值。
创建Set
Set 对象可以存储任何类型的唯一值,无论是原始值或者是对象引用。创建 Set 的实例需要用到 Set 构造函数,并且传入的参数必须只能是可迭代对象,例如数组,字符串
示例:
创建一个空的 set:
let set1 = new Set();
console.log(set1);
// 输出: Set {}
创建并初始化一个 set
let set2 = new Set([1, 2, 3, 2, 1]);
console.log(set2);
// 输出: Set {1, 2, 3}
上述代码中,表名 Set 中的值必须是唯一的,不允许重复。
Set的方法和属性
add()方法
add() 方法用于向 Set 中添加元素,返回一个新的 Set。
示例:
例如我们可以向 Set 中添加不同类型的值:
let set1 = new Set();
set1.add(1);
set1.add('xkd');
console.log(set1);
// 输出: Set { 1, 'xkd' }
delete()方法
delete() 方法用于删除 Set 中的元素,返回一个布尔值,判断是否删除成功。如果删除成功返回 true,删除失败返回 false。
示例:
删除 Set 中的指定元素:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.delete(4)); // 输出:true
console.log(set1); // 输出:Set { 1, 2, 3, 5 }
如果指定的元素在 Set 中不存在,则返回 false,表示删除失败:
console.log(set1.delete(10)); // 输出:false
has()方法
has() 方法用于判断某个值是否为 Set 的成员,返回一个布尔值。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.has(2)); // 输出:true
console.log(set1.has(7)); // 输出:false
上述代码中,2 是 set1 中的成员,所以返回 true,而 7 不是所以返回 false。
clear()方法
clear() 方法用于清空 Set 中的全部成员。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
set1.clear();
console.log(set1); // 输出:Set {}
size属性
size 属性返回当前 Set 元素总数。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.size); // 输出:5
Set 遍历操作
Set 结构的实例有四个遍历方法,可以用于遍历 Set 中的成员。我们一起来看一下。
keys()方法
keys() 方法是用于返回键名的遍历器。
示例:
let set_k = new Set(['xkd', 'Iven', 'summer']);
console.log(set_k.keys());
// 输出: [Set Iterator] { 'xkd', 'Iven', 'summer' }
values()方法
values() 方法是用于返回键值的遍历器。
示例:
let set_v = new Set(['xkd', 'Iven', 'summer']);
console.log(set_v.values());
// 输出: [Set Iterator] { 'xkd', 'Iven', 'summer' }
由于 Set 结构没有键名,只有键值,或者说键名和键值是同一个,所以 keys 方法和 values 方法的行为完全一致。
entries()方法
entries() 方法是用于返回键值对的遍历器。
示例:
let set_e = new Set(['xkd', 'Iven', 'summer']);
console.log(set_e.entries());
输出:
[Set Entries] {
[ 'xkd', 'xkd' ],
[ 'Iven', 'Iven' ],
[ 'summer', 'summer' ]
}
forEach()方法
forEach() 方法使用回调函数遍历每个成员。
示例:
let set_f = new Set(['xkd', 'Iven', 'summer']);
set_f.forEach(function(value,key){
console.log(value+":"+key);
})
输出:
xkd:xkd
Iven:Iven
summer:summer
forEach 方法的参数就是一个回调函数,该函数的参数与数组的forEach一致,依次为键值、键名、集合本身。这里需要注意,Set 结构的键名就是键值因此第一个参数与第二个参数的值永远都是一样的。
forEach 方法还可以有第二个参数,表示绑定处理函数内部的this对象。
Set对象的作用
- 去重
let set1 = new Set([1, 2, 3, 4, 2, 4]);
console.log(set1); // Set { 1, 2, 3, 4 }
- 并集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var union = new Set([...set1, ...set2]);
console.log(union); // 输出:Set { 1, 2, 3, 7, 6 }
- 交集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
let inter = new Set([...set1].filter(x=>set2.has(x))) //{4,5}
console.log(inter); // 输出:Set { 1 }
- 差集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var diff = new Set([...set1].filter(x => !set2.has(x))); // {1}
console.log(diff); // 输出:Set { 2, 3 }
Set类型转换
Set 类型的值可以和其他数据类型的值进行类型转换,我们来看一下。
- Array 转为 Set :
let arr1 = ["x", "k", "d"];
let set1 = new Set(arr1);
console.log(set1); // 输出:Set { 'x', 'k', 'd' }
- Set 转为 Array :可以通过扩展运算符 ... 来实现。
let set1 = new Set(["x", "k", "d"]);
var arr1 = [...set1];
console.log(arr1); // 输出:[ 'x', 'k', 'd' ]
- String 转为 Set:
let set1 = new Set('xkd');
console.log(set1); // 输出:Set { 'x', 'k', 'd' }
注意 Set 中的 toString 方法是不能将 Set 转换成 String 类型的。