set map和WeakSet 集合

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除外)
键名所指向的对象可以被垃圾回收,此时键名是无效的
不能遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值