Map 和 Set 的用法及区别

Set
1.1 简介
Set是ES6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。
Set是一个构造函数,用来生成set的数据结构。

set打印出来的数据结构,是一个对象

var set=new Set([1,2,3])
console.log(set)  // Set(3) {1,2,3}

1.2 常用语法
要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

//初始化一个Set ,需要一个Array数组,要么空Set
var set = new Set([1,2,3,5,6]) 
console.log(set)  // {1, 2, 3, 5, 6}

//添加元素 add()
//返回 Set 结构本身,当添加实例中已经存在的元素,set不会进行处理添加。也可以采用链式写法
set.add(7) //{1, 2, 3, 5, 6, 7}

//删除元素 delete(), 返回一个布尔值。
set.delete(3) // {1, 2, 5, 6, 7}

//检测是否含有此元素,有为true,没有则为false
set.has(2) //true

//清除所有元素,没有返回值。

1.3 用途
最常用来数组去重,去重方法有很多但是都没有它运行的快
var arr = [2, 3, 5, 3, 5, 2];
var arrSet = new Set(arr);
console.log(arrSet);    // Set(6) {2, 3, 5}
 
//方法一:用ES6的...结构
let newArr1 = [...arrSet];
console.log(newArr1 );    // [2, 3, 5]
 
//方法二:用Array.from()将类数组转化为数组
let newArr2 = Array.from(arrSet);
console.log(newArr2 );    // [2, 3, 5]

字符串去重
var str = "2234332244";
var newStr = [...new Set(str)].join("");

或转为数组再去重
console.log(newStr);    //234

Set结构的实例有四个遍历方法,可用于遍历成员。
keys(), values(), entries()返回的都是遍历器对象。
Set结构没有键名,只有键值,所以keys()和values()方法的行为完全一致

keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
var list = new Set(["a", 1, 2, 3]);
for(let key of list.keys()) {
    console.log(key);    // a 1 2 3
}

var list = new Set(["a", 1, 2, 3]);
for(let value of list.values()) {
    console.log(value);    // a 1 2 3
}

var list = new Set(["a", 1, 2, 3]);
for(let row of list.entries()) {
    console.log(row);    // ["a", "a"] [1, 1] [2, 2] [3, 3]
}

var list = new Set(["a", 1, 2, 3]);
list.forEach((value, key) => {
    console.log(key + ":" + value);    // a:a  1:1  2:2  3:3
});
 

Map类似于对象,数据结构是一个键值对的结构,但是“键”的范围不限制于字符串,各种类型的值(包含对象)都可以当作键。
Map 也可以接受一个数组作为参数,数组的成员是一个个表示键值对的数组。注意Map里面也不可以放重复的项。

2.2 常用语法
一个key只能对应一个value,多次对一个key放入value,后面的值会把前面的值覆盖掉
初始化Map需要一个二维数组,或者直接初始化一个空Map

//初始化`Map`需要一个二维数组或者直接初始化一个空`Map` 
let map = new Map();

var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
console.log(m.get('Michael')) // 95

//添加key和value值
map.set('Amy','女')
map.set('liuQi','男')

//是否存在key,存在返回true,反之为false
map.has('Amy') //true
map.has('amy') //false

//根据key获取value
map.get('Amy') //女

//删除 key为Amy的value
map.delete('Amy')
map.get('Amy') //undefined  删除成功

遍历map对象

forEach遍历:

          map.forEach(function(value,key){
            console.log(value,key);
          });
     函数中第一个参数是属性值,第二个参数是属性

3. 区别
map和set一样是关联式容器,它们的底层容器都是红黑树

两种方法具有极快的查找速度
Map 和 Set 都不允许键重复
初始化需要值不一样,Map需要的是一个二维数组,而Set 需要的是一维 Array 数组
Map 是键值对的存在,键和值是分开的;Set 没有 value 只有 key,value 就是 key;
————————————————
版权声明:本文为CSDN博主「举一个栗子吖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45359288/article/details/124940412

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值