ES6中新增的Set、Map两种数据结构怎么理解?

如果要用一句话描述,我们可以说

Set是一种叫做集合的数据解构,Map是一种叫做子字典的书据解构

什么事集合,什么又是字典

  • 集合

        是由一堆无序的,相关联的,且不重复的内存结构【数学组称为元素】组成的组合

  • 字典

        是一些元素的结合,每个元素有一个称作key的域,不同元素的key各不相同

区别?

  • 共同点:集合,字典都可以存储不重复的值
  • 不同点,集合是以[值,值]的形式储存元素,字典是以[键,值]的形式存储
一.Set

Set是es6新增的数据结构,类似于数组,但是成员的值都是唯一的,没有重复的值,我们一般称为集合

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

const s = new Set()

 增删查改

Set的实例关于增删查改的方法

  • add()
  • delete()
  • has()
  • clear()

add()

 添加某个值,返回Set结构本身

当添加实例中已经存在的元素,Set不会进行处理添加

s.add(1).add(2).add(2) //2只被添加了一次

delete()

 删除某个值

    s.delete(1)

has()

返回一个布尔值,判断该值是否为Set的成员

 console.log(s.has(2));//true

clear()

 清除所有成员,没有返回值

s.clear()

遍历

Set实例遍历的方法有如下

  •  keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值名对的遍历器
  • forEach():使用回调函数遍历每个成员

Set的遍历顺序就是插入顺序

keys方法,values方法,entries方法返回的都是遍历器对象

let set = new Set(['red','green','blue']);

for(let item of set.keys()){
    console.log(item)
      //red
      //green
      //blue
}

for(let item of set.values()){
    console.log(item)
     //red
     //green
     //blue
}

for(let item of set.entries()){
    console.log(item)
      //['red','red']
      //['green','green']
      //['blue','blue']
}

forEach()用于对每个成员执行某种操作,没有返回值,键值,键名都相等,同样的forEach方法有第二个参数,用于绑定处理函数的this

     let set = new Set([1, 4, 9]);
     set.forEach((value, key) => console.log(key + ' : ' + value))
      // 1 : 1
      // 4 : 4
      // 9 : 9
         

扩展运算符和Set结构结合实现数组或者字符串去重

//数组
let arr = [1,3,4,5,3,4,3,2,2,];
let unique = [...new Set(arr)];//[1,3,4,5,2]

//字符串
let str ='4356435';
let unique = [...new Set(str)].join("")
console.log(unique);//4356

实现并集,交集,和差集

let a = new Set([1,2,3]);
let b = new Set([4,3,2]);

//并集
let union = new Set([...a,...b])
//Set{1,2,3,4}

//交集
let intersect = new Set([...a].filter(x=>b.has(x)));
// Set {2,3}

//(a相对于b的)差集
let intersect = new Set([...a].filter(x=>!b.has(x)));
// Set {1}
二.Map

Map类型是键值对的有序列表,而键和值都可以是任意类型

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

 增删查改

Map结构的实例针对增删查改有以下属性和操作方法:

  •  size属性
  • set()
  • get()
  • has()
  • delete()
  • clear()

size

size属性返回Map结构的成员总数

const map = new Map()
map.set('foo',true)
map.set('baz',false)
map.size//2

set()

设置键名key对应的键值为value,然后返回整个Map结构

如果key已经有值,则键值会被更新,否则就新生该键

同时返回的是当前Map对象,可以采用链式写法

const m = new Map();

m.set('edition', 6)        // 键是字符串
m.set(262, 'standard')     // 键是数值
m.set(undefined, 'nah')    // 键是 undefined
m.set(1, 'a').set(2, 'b').set(3, 'c') // 链式操作

get()

get 方法读取key对应的键值,如果找不到key,则返回undefined

const m = new Map();

const hello = function() {console.log('hello');};
m.set(hello, 'Hello ES6!') // 键是函数

m.get(hello)  // Hello ES6!

has()

has方法返回一个布尔值,表示某个键值是否在当前Map对象之中

const m = new Map();

m.set('edition', 6);
m.set(262, 'standard');
m.set(undefined, 'nah');

m.has('edition')     // true
m.has('years')       // false
m.has(262)           // true
m.has(undefined)     // true

delete()

delete方法删除某个键,返回true,如果删除失败,返回false

const m = new Map();
m.set(undefined, 'nah');
m.has(undefined)     // true

m.delete(undefined)
m.has(undefined)       // false

clear()

clear方法清除所有成员没有返回值

let map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2
map.clear()
map.size // 0

写到不想写了,将就着看吧,能应对面试官就行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值