1、Set()
Set() 是ES6新增的一种集合类型,结构和Array 很像,只是它的方法和属性没有Array丰富,但是有一点,它的成员是唯一的,没有重复的值
它的API和Map很类似,只是用add() 替换了Map的set(),并且没有了 get() 方法
1.1 基本的API
1、创建一个Set
Set 本身是一个构造函数,用来生成 Set 数据结构
let set = new Set();
console.log(set); // {}
Set() 对象可以存储任意类型的值,但是用Set() 构造函数传入的参数只能是可迭代对象,如:数组、字符串
// 当你传入一个整数时,js会告诉你传入的参数1不是可迭代对象
let set = new Set(1);
console.log(set); // number 1 is not iterable
// 必须是数组或字符串,传入对象会报错
let set1 = new Set('1');
console.log(set1);
let set2 = new Set([1, 'true']);
console.log(set2);
2、常见的方法
| 方法 | 说明 | 示例 |
|---|---|---|
has() | 判断是否有该值,返回布尔值 | set.has('name') |
add() | 向Set()添加元素,若有相同会覆盖 | set.add('name', 'zxc') |
delete() | 用于删除某个元素,成功则返回true,失败返回false | set.deldect('name') |
clear() | 用于清空 Set() 中所有的成员,没有返回值 | set.clear() |
size 属性 | 判断 Set() 有多少个元素 | set.size |
let set = new Set()
let arr = [1, 2]
set.add(1).add(arr)
set.add(function() { console.log(123); })
set.add({})
console.log(set); // { 1, [ 1, 2 ], [Function (anonymous)], {} }
// has() 判断元素
console.log(set.has(arr)); // true
// size 判断长度
console.log(set.size); // 4
// delete 删除
console.log(set.delete(1)); // true
// clear 清除
set.clear()
console.log(set); // {}
1.2 顺序与迭代
Set() 结构有四个遍历的方法
| 方法 | 说明 | 示例 |
|---|---|---|
keys() | 返回键的遍历器 | set.keys() |
values() | 返回值的遍历器 | set.values() |
entries() | 返回所有成员的遍历器,包含键,值 | set.entries() |
forEach | 遍历Set的所有成员 | set.forEach(function(), [this]) |
由于Set结构没有键名,所以其键名和键值是一致的
let set = new Set(['张三', '李四', '王五', 'true']);
// 遍历键
console.log(set.keys()); // { '张三', '李四', '王五', 'true' }
// 遍历值
console.log(set.values()); // { '张三', '李四', '王五', 'true' }
// 返回键值
console.log(set.entries());
/* {
[ '张三', '张三' ],
[ '李四', '李四' ],
[ '王五', '王五' ],
[ 'true', 'true' ]
}*/
// forEach() 循环
let set = new Set(['张三', '李四', '王五', 'true'])
set.forEach(function(value, key) {
console.log(key + ':' + value);
})
/*
张三:张三
李四:李四
王五:王五
true:tru*/
也可以使用 for...of 或 for...in
// 遍历值
for (let value of set) { console.log(value);}
// 遍历键
for (let key in set) {console.log(key);}
1.3 Set() 类型转换
Set 类型可以与其它类型的值进行转换
Array转换为Set
let arr = [1, 2, 3, 4]
let set = new Set(arr)
console.log(set); // { 1, 2, 3, 4 }
Set转换为Array:可以通过扩展运算符...来实现
let set = new Set([1, 2, 3, 4])
console.log([...set]); // [ 1, 2, 3, 4 ]
String转换为Set
let str = '张三'
let set = new Set(str)
console.log(set); // { '张', '三' }
1.4 Set 对象的作用
利用Set不重复性可以用于数组的去重
// 将数组转换为Set,再将Set转换为数组
let arr = [1, 1, 4, 1, 2, 3, 1, 2]
let set = new Set(arr)
console.log([...set]); // [ 1, 4, 2, 3 ]
并集操作:将两个数组进行并集操作
let arr1 = [1, 1, 4, '1', 2, 3]
let arr2 = [5, 1, '2']
let set = new Set([...arr1, ...arr2])
console.log([...set]); // [ 1, 4, '1', 2, 3, 5, '2' ]
Set不允许强制转换,1 和 ‘1’ 被认为是不同的值
总结:
Set()最大的特点就是它的元素是唯一的,基于这个特性可以用于去重Set()可以存储任意类型的值,但是初始化的时候只能传入可迭代对象Set()可以与Array进行互相转换,也可以把String转换为Set类型
2、WeakSet()
WeakSet 是一种 “若集合”类型,其集合中的值只能是对象
2.1 API
| 方法 | 说明 | 示例 |
|---|---|---|
has() | 判断是否有该值,返回布尔值 | map.get('name') |
add() | 向Set()添加元素,若有相同会覆盖 | map.set('name', 'zxc') |
delete() | 用于删除某个元素,成功则返回true,失败返回false | map.deldect('name') |
1、创建一个空的WeakMap
let WeakSet = new WeakSet();
2、初始化WeakSet
构造函数可以传入一个迭代对象,可迭代对象中的值必须得是对象
let x = { id: 1 },
y = { id: 2 }
let weakSet = new WeakSet([x, y]);
console.log(weakSet);
console.log(weakSet.has(x)); // true
console.log(weakSet.delete(x)); // true
WeakSet中没有clear方法 和size属性
因为
WeakSet中的值任何时候都可能被销毁,所以没必要提供迭代的功能,也用不着先clear这个清空的功能