Map

Map是一组键值对的结构,用于解决以往不能用对象做为键的问题

  • 具有极快的查找速度
  • 函数、对象、基本类型都可以作为键或值

Map和Object的区别

  • Map可以把数组、对象、函数作为键值来使用
  • Map中的键值是有序的(FIFO 原则),而添加到对象中的键则不是

声明定义

可以接受一个数组作为参数,该数组的成员是一个表示键值对的数组。

let map =new Map([['yangyang','lulu']])

console.log(map); //Map(1) { 'yangyang' => 'lulu' }

map的方法

  • set(key, val): 向Map中添加新元素
  • get(key): 通过键值查找特定的数值并返回
  • has(key): 判断Map对象中是否有Key所对应的值,有返回true,否则返回false
  • delete(key): 通过键值从Map中移除对应的数据
  • clear(): 将这个Map中的所有元素删除
let map = new Map([
    ['yangyang', 'lulu'],
    ['lvlv', 'yanghu']
])

console.log(map); //Map(1) { 'yangyang' => 'lulu' }

console.log(map.get("yangyang")) //lulu

function yang() {}

map.set(yang, "yangyang.com") //   {'yangyang' => 'lulu','lvlv' => 'yanghu',{…} => "yangyang.com"} 

map.has(yang) //true

map.delete(yang) //{'yangyang' => 'lulu','lvlv' => 'yanghu'} 

map.clear() //null

遍历数据

使用 keys()/values()/entries() 都可以返回可遍历的迭代对象。

let yangyang = new Map([["yangyang", "lulu"], ["lvlv", "yanghu"]]);

console.log(yangyang.keys()); //MapIterator {"yangyang", "lvlv"}

console.log(yangyang.values()); //MapIterator {"lulu", "yanghu"}

console.log(yangyang.entries()); //MapIterator {"yangyang" => 
"lulu", "lvlv" => "yanghu"}

map与其他数据结构的互相转换

  • 通过展开语法[...map]即可转换为数组类型
  • 与对象进行转化
const obj = {}
const map = new Map(['a', 111], ['b', 222])
for(let [key,value] of map) {
  obj[key] = value
}
console.log(obj) // {a:111, b: 222}

  • JSON字符串要转换成Map可以先利用JSON.parse()转换成数组或者对象,然后再转换即可。

Set

set有点类似于数组类型,区别最大的就是set当中的值都是唯一的

声明定义

  • 只能保存值没有键名
  • 值是唯一的
  • 遍历顺序是添加的顺序,方便保存回调函数
  • 可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
let obj = { 1: "yang", "1": "yangyang" };

console.table(obj); //{1:"yangyang"}

set的方法

  • add(value):添加某个值,返回 Set 结构本身(可以链式调用)。
//使用 add 添加元素,不允许重复添加yang值
let hd = new Set();

hd.add('yangyang');
hd.add('yang');
hd.add('yang')

console.log(hd.values()); //SetIterator {"yangyang", "yang"}

  • delete(value):删除某个值,删除成功返回true,否则返回false。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。
let hd = new Set(["yang","yangyanghu"]);

console.log(hd.delete("yang")); //true

console.log(hd.values());
console.log(hd.has("lvlv")); //false
console.log(hd.clear()); //undefined

Set 对象作用

  • 数组去重(利用扩展运算符)
const arr = [1, 2, 3, 5, 2, 3];
console.log(...new Set(arr)); // 1,2,4,5

  • 并集

let hd1 = new Set(["yang","yangyanghu"]);
let hd2 = new Set(["yanghu","yangyanghuhu"]);


const hds=[...hd1,...hd2]
console.log(hds);//[ 'yang', 'yangyanghu', 'yanghu', 'yangyanghuhu' ]

  • 交集
    获取两个集合中共同存在的元素
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let intersect = new Set([...a].filter(x => b.has(x)))  // {2, 3} 利用数组的filter方法

  • 差集
    在集合a中出现但不在集合b中出现元素集合
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let difference = new Set([...a].filter(x => !b.has(x))) //  {1} 

Q.E.D.