Set集合
Set 原本就是一个构造函数,Set 集合主要用于存储不重复的数据,简单来说就是数据的去重
Set 函数可接受一个数组(或具有 iterable 接口的其他数据结构)作为参数,用来初始化
//类数组对象作为参数
const s = new Set(document.getElementsByTagName('div'));
s.size;
Set与扩展运算符(…)实现数组去重
//Set实现简单的数组去重
const s = new Set([2, 4, 5, 2, 5, 3, 1]); //数组作为参数
console.log(s);// {2, 4, 5, 3, 1}
//返回的是一个对象形式,可通过...运算符转为数组形式
const s = [...new Set([2, 4, 5, 2, 5, 3, 1])];
console.log(s); //[2, 4, 5 ,3, 1]
Set属性:
size : 返回集合所包含元素的数量,只能读取,不能修改
const s = new Set([1, 3, 6, 5, 2, 1, 3, 1, 4]);
s.size; //6
Set实例对象方法:
add():添加值,返回Set结构本身
has() :判断值是否存在集合当中,返回值为Boolean类型,若存在,返回true,否则false
delete():删除集合中某个值,返回值为Boolean类型,表示删除成功与否
clear():清除所有数据
const s = new Set([1, 2, 3, 5]);
s.add(4)
s.add(4)//无效添加
//has()
s.has(3);//true
s.has(6);//false
//clear()
s.clear();
//delete()
s.delete();
Set特殊点:
Set 用于存放不重复的数据,若存放的值为一个原始值,会装换为字符串对象之后,再进行存储
NaN 与 NaN 为不恒等的,但在 Set 中的 NaN 与 NaN 相等,所以只能存在一个,不存在重复
+0 与 -0 在存储判断用 Objec.is() 判断是相等的,因此不重复
undefined 与 undefined 是恒等的,因此不重复
Set遍历的方法
keys()、values()、entries()
//keys()、values()一样,返回形式一样
const s = new Set(['a', 'b', 'c']);
for(let item of s.keys()){
console.log(item)
}
// a
// b
// c
//以键值对的形式返回
for(let item of s.entries()){
console.log(item)
}
["a", "a"]
["b", "b"]
["c", "c"]
用 Set 实现交集、并集、差集
let arr1= new Set([1, 2, 3])
let arr2= new Set([4, 3, 2])
let intersect = new Set([...arr1].filter(value => arr2.has(value)))
let union = new Set([...arr1, ...arr2])
let difference = new Set([...arr1].filter(value => !arr2.has(value)))
console.log(intersect) // Set {2, 3}
console.log(union) // Set {1, 2, 3, 4}
console.log(difference) // Set {1}
Map 集合
Map 集合是以键值对的形式存储数据,键名不能重复,这也是Map 与Set 的不同点
键名相同,新添加的值将会覆盖前面的值
const m = new Map();
m.set(9, 'a')
.set(9, 'b');
Map 可以是一个数组作为参数
const m = new Map([
['1', 'green'],
['2', 'red']
]);
m.size; //2
m.has('1') //true
m.get('1') //"green"
m.has('2') //true
m.get('2') //"red"
Map 集合的实例对象方法:
其余的几个方法和Set的一样
get(key): 通过键值查找特定的数值并返回
Map转为Obj
Map 的键名为对象,而 Object 的键名都为字符串,所以转换时将非字符串键名转换为字符串键名
function fun(m) {
let obj = Object.create(null)
for (let [key, value] of m) {
obj[key] = value
}
return obj
}
const m = new Map().set('uname', 'Ya').set('age', 18)
fun(m) // {uname: "Ya", age: 18}
Obj转为Map
function fun(obj) {
let m= new Map()
for (let key of Object.kes(obj)) {
m.set(key, obj[key])
}
return m
}
fun({uname: "Ya", age: 18})
WeakSet 集合
内部存储地址不会影响到垃圾回收机制
只能添加对象
不能遍历,不是一个可迭代对象,没有size属性也没有foreach方法
属性:
constructor:构造函数
方法:
add(value):在WeakSet 对象中添加一个元素value
has(value):判断 WeakSet 对象中是否包含value
delete(value):删除元素 value
WeakMap 集合
WeakMap 对象是一组键值对的集合
属性:
constructor:构造函数
方法:
has(key):判断是否有 key 关联对象
get(key):返回key关联对象(没有则则返回 undefined)
set(key):设置一组key关联对象
delete(key):移除 key 的关联对象
与WeakSet 集合类似
键名只能是对象,只接受对象作为键名(null除外)
键名所指向的对象可以被垃圾回收,此时键名是无效的
不能遍历