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
类型的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。