【es6】set和map数据结构解析

set

set本身是一个构造函数,用来生成set数据结构

就像array本身是一个构造函数,用来生成数组数据结构

set里面的值不可以重复

set用法

  • 初始化,
    =>set可以接收数组作为参数初始化,将数组中重复着的值去掉
    var items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); items.size // 5

进而引申出数组去重的方法,[...new set([1,2,33,3,3,4,])

=>set也可以接收对象作为参数

function fin(){
    
    
return [...document.querrySelectorAll('div')];
}
let s = new set(fin());
  • 添加值
    add()函数 添加时不会发生类型转换,

  • 关于是否相等

5和‘5’是不同的值
set内部NAN和NAN是相等的
两个对象总是不想等的,因为对象的值其实是地址

set实例的属性和方法

  • 属性
    1、size
    2、constructor指向Set构造函数

  • 方法
    1、添加add(),返回set结构本身
    2、删除delete()返回true表示成功
    3、has()返回bool值
    4、clear()清除所有,无返回值

  • 转化成数组
    1、Array.form(set)返回一个数组

  • 遍历操作
    1、set.keys()返回set的键值,和set.value()方法返回的都是键值的遍历器对象,也就是数组
    3、set.entries()返回完全相同的键名和键值对

set结构的实例默认就是可以遍历的,所以可以省略遍历器方法,直接遍历该对象

let set1 = new Set([{
    
    name ;'mary'},{
    
    name:'jack'})
for(let x of set1){
    
    
console.log(x);
//输出x的值,也就是每一个对象
}
//foreach方法
set1.forEach((vlaue,key)=>{
    
    
value+=2;
}
//foreach方法的参数是键值键名,集合本身

set的应用

  • 使用结构语法,将set结构为数组,可以使用数组的方法

举例:
注意:关于filter里面的箭头函数,如果只要一条语句,不加大括号,可以不用返回值,如果加了大括号。就必须带上return

另外,数组的find参数是函数,cha找符合条件的值,includes判断有没有

//求两数组的交集
//输出x的值
let arr1 = [1,2,3,4,5];
let arr2 = [3,4,5,6,7];
console.log(arr1.includes(1));
let set1 = new Set([...arr1,...arr2]);
  let arr3 =  [...set1].filter((value)=>{
    
    
      console.log(value);
      
      if( arr1.includes(value)&&arr2.includes(value))
      return value;
         
         
});
console.log(arr3);
}
//或者
let set3 = new Set([...set2].filter((x)=>set1.has(x);
//求并集
let set3 = new Set([...set1,...set2]);
//差集
let set3 =  new Set([...set2].filter(x)=>!set1.has(x);

如果想在遍历的时候改变原来的set结构,需要使用map或者***array.from***

weakset

  • 结构和set类似,也是不重复的值,但是值只可以是***对象***
  • 里面的对象是***弱引用***,垃圾回收的时候不考虑weakset里面的值
  • let ws = new WeakSet(),参数是对象数组[{},{}],或者是二维数组[[],[]],数组里面的元素成为weakset里面的元素,不可以是一维数组
  • ***不可以遍历,不可以引用***没有size属性,
  • 可以使用add(),delete(),has()
  • 可以用来存储dom节点

map

为什么引入map

因为原本的对象只可以使用字符串作为键名,引入map之后,键名类型多样化

map的本质
set类似于数组,map类似于对象,map本质是键值对的集合,map也不允许重复

map构造函数
传入一个数组,数组的元素是键值对,不是对象new Map([['name','kek'],'name','kkke'])
里面的值一定加上引号,因为作为数组的值,加上引号才是字符串
实际上执行的算法

items.forEach((key,value)=>{
    
    map1.set(key,value));

map可以使用对象作为键名

let obj = {
    
    
name:'marria',
age:14
}
let map1 = new Map();
map1.set(obj,'okok');

map的添加方法是set不是add,删除delete,判断has,获取键名对应的值是get
map键的规则
类型不同,键就不同
对同一个键赋值多次,后一个覆盖前一个

set(['a'],'keke');
get(['a'])获取undefine

因为两次的[‘a’]看起来是一样的,但是由于是引用类型,地址不一样
NAN看作同一个键

map的遍历
keys 获取键名集合,map.get('key')
values获取值得集合
entries获取键值对map.entries()或者直接遍历forof和map也是获取键值对

猜你喜欢

转载自blog.csdn.net/weixin_43124546/article/details/110915966